From 6b9ee0ca13b99ee20f9d0c680a950c6a7494a5a0 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 24 Jul 2011 23:12:46 -0500 Subject: [PATCH 001/134] Store the task id of a processing action in the database. --- mediagoblin/db/migrations.py | 12 ++++++++++++ mediagoblin/db/models.py | 3 +++ mediagoblin/submit/views.py | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 6a8ebcf9..797d39de 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -52,3 +52,15 @@ def mediaentry_mediafiles_main_to_original(database): document['media_files']['original'] = original collection.save(document) + + +@RegisterMigration(3) +def mediaentry_add_queued_task_id(database): + """ + Add the 'queued_task_id' field for entries that don't have it. + """ + collection = database['media_entries'] + collection.update( + {'queued_task_id': {'$exists': False}}, + {'$set': {'queued_task_id': None}}, + multi=True) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index bad15aca..e97dc537 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -162,6 +162,8 @@ class MediaEntry(Document): 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'} @@ -190,6 +192,7 @@ class MediaEntry(Document): # 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, diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 1848f5e5..f19bf22e 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -84,7 +84,8 @@ def submit_start(request): entry.save(validate=True) # queue it for processing - process_media_initial.delay(unicode(entry['_id'])) + result = process_media_initial.delay(unicode(entry['_id'])) + entry['queued_task_id'] = result.task_id add_message(request, SUCCESS, 'Woohoo! Submitted!') From 68cf996c1df17ac1f53f5fd86b71bfdfcb9f2aba Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 18 Jul 2011 14:07:03 +0200 Subject: [PATCH 002/134] First start at MountStorage. This includes the mounttab, a resolver and adding mount entries. --- mediagoblin/storage.py | 76 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 5d6faa4c..3d5ce9ab 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -216,6 +216,82 @@ class BasicFileStorage(StorageInterface): return self._resolve_filepath(filepath) +class MountStorage(StorageInterface): + def __init__(self, **kwargs): + self.mounttab = {} + + def mount(self, dirpath, backend): + """ + Mount a new backend under dirpath + """ + new_ent = clean_listy_filepath(dirpath) + new_ent.append(u'') + + print "Mounting:", repr(new_ent) + already, rem_1, table, rem_2 = self.resolve_to_backend(new_ent, True) + print "===", repr(already), repr(rem_1), repr(rem_2) + + assert rem_1.pop(-1) == u'', "Internal Error 1" + assert rem_2.pop(-1) == u'', "Internal Error 2" + assert (already is None) or (len(rem_2) > 0), "Already mounted" + for part in rem_2: + table[part] = {} + table = table[part] + table[None] = backend + + def resolve_to_backend(self, filepath, extra_info = False): + """ + extra_info = True is for internal use! + + Normally, returns the backend and the filepath inside that backend. + + With extra_info = True it returns the last directory node and the + remaining filepath from there in addition. + """ + table = self.mounttab + filepath = filepath[:] + res_fp = None + while True: + new_be = table.get(None) + if (new_be is not None) or res_fp is None: + res_be = new_be + res_fp = filepath[:] + res_extra = (table, filepath[:]) + # print "... New res: %r, %r, %r" % (res_be, res_fp, res_extra) + if len(filepath) == 0: + break + query = filepath.pop(0) + entry = table.get(query) + if entry is not None: + table = entry + res_extra = (table, filepath[:]) + else: + break + if extra_info: + return (res_be, res_fp) + res_extra + else: + return (res_be, res_fp) + + def __repr__(self, table = None, indent = ""): + res = [] + if table is None: + res.append("MountStorage<") + table = self.mounttab + v = table.get(None) + if v: + res.append(indent + "On this level: " + repr(v)) + for k, v in table.iteritems(): + if k == None: + continue + res.append(indent + repr(k) + ":") + res += self.__repr__(v, indent + " ") + if table is self.mounttab: + res.append(">") + return "\n".join(res) + else: + return res + + ########### # Utilities ########### From 93b2796c7e89e269d60db8e48bf84a0f2ca88d12 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 23 Jul 2011 15:27:02 +0200 Subject: [PATCH 003/134] MountStorage: Some small fixups/changes. 1) A bit more assert. 2) Change __repr__ to use lists for the recursion parameter. --- mediagoblin/storage.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 3d5ce9ab..d994268b 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -237,6 +237,7 @@ class MountStorage(StorageInterface): for part in rem_2: table[part] = {} table = table[part] + assert not table.has_key(None), "Huh? Already mounted?!" table[None] = backend def resolve_to_backend(self, filepath, extra_info = False): @@ -272,19 +273,19 @@ class MountStorage(StorageInterface): else: return (res_be, res_fp) - def __repr__(self, table = None, indent = ""): + def __repr__(self, table = None, indent = []): res = [] if table is None: res.append("MountStorage<") table = self.mounttab v = table.get(None) if v: - res.append(indent + "On this level: " + repr(v)) + res.append(" " * len(indent) + repr(indent) + ": " + repr(v)) for k, v in table.iteritems(): if k == None: continue - res.append(indent + repr(k) + ":") - res += self.__repr__(v, indent + " ") + res.append(" " * len(indent) + repr(k) + ":") + res += self.__repr__(v, indent + [k]) if table is self.mounttab: res.append(">") return "\n".join(res) From 937e2c88112ee2f2ec71b9b38ccb1b473f32237e Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 23 Jul 2011 15:29:22 +0200 Subject: [PATCH 004/134] MountStorage: Create all the wrappers All those methods just call the appropiate method of the relevant backend. --- mediagoblin/storage.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index d994268b..e3d54a30 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -292,6 +292,34 @@ class MountStorage(StorageInterface): else: return res + def file_exists(self, filepath): + backend, filepath = self.resolve_to_backend(filepath) + return backend.file_exists(filepath) + + def get_file(self, filepath, mode='r'): + backend, filepath = self.resolve_to_backend(filepath) + return backend.get_file(filepath, mode) + + def delete_file(self, filepath): + backend, filepath = self.resolve_to_backend(filepath) + return backend.delete_file(filepath) + + def file_url(self, filepath): + backend, filepath = self.resolve_to_backend(filepath) + return backend.file_url(filepath) + + def get_local_path(self, filepath): + backend, filepath = self.resolve_to_backend(filepath) + return backend.get_local_path(filepath) + + def copy_locally(self, filepath, dest_path): + """ + Need to override copy_locally, because the local_storage + attribute is not correct. + """ + backend, filepath = self.resolve_to_backend(filepath) + backend.copy_locally(filepath, dest_path) + ########### # Utilities From aaa46f5a156093c4295e4cb0d85eae72e28468ea Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Tue, 2 Aug 2011 21:17:30 +0200 Subject: [PATCH 005/134] Sidebar changes: correct tags header to be

, show action buttons header only to owner --- mediagoblin/templates/mediagoblin/user_pages/media.html | 5 +---- mediagoblin/templates/mediagoblin/utils/tags.html | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index a1382518..ddcf3ce9 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -103,11 +103,9 @@
{% include "mediagoblin/utils/prev_next.html" %} -

Sidebar content here!

- -

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

Temporary button holder

delete

{% endif %} -

{% if media.tags %} {% include "mediagoblin/utils/tags.html" %} diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index ade41944..32db6e31 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -17,7 +17,7 @@ #} {% block tags_content -%} -

Tags

+

Tags

@@ -85,7 +85,7 @@ {% block mediagoblin_footer %}
{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index d19034cb..3dc170c8 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -26,15 +26,15 @@ media= media._id) }}" method="POST" enctype="multipart/form-data">
-

Editing {{ media.title }}

+

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

{{ wtforms_util.render_divs(form) }}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index a11b86d7..4171cb4d 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -25,10 +25,10 @@ user['username'] }}" method="POST" enctype="multipart/form-data">
-

Editing {{ user['username'] }}'s profile

+

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

{{ wtforms_util.render_divs(form) }}
- +
diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index 6f10ec8d..18123dbd 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -26,7 +26,7 @@ {% block mediagoblin_content -%}

- Media tagged with: {{ tag_name }} + {% trans %}Media tagged with:{% endtrans %} {{ tag_name }}

From 9188f3afe24a52fff3262360a0896cc521546fa8 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Mon, 8 Aug 2011 03:47:17 +0200 Subject: [PATCH 018/134] Feature #298 - Changed some defaults in gmg_commands.import_export --- mediagoblin/gmg_commands/import_export.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index aa3fe1a1..c05a48d9 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -19,6 +19,7 @@ from mediagoblin import mg_globals 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 import util as mg_util import shlex import tarfile @@ -33,7 +34,7 @@ def import_export_parse_setup(subparser): '-cf', '--conf_file', default='mediagoblin.ini', help='Config file used to set up environment') subparser.add_argument( - '--mongodump_cache', default='mongodump', + '--mongodump_cache', default='/tmp/mediagoblin/mongodump', help='mongodump cache directory') subparser.add_argument( '--mongodump_path', default='mongodump', @@ -42,12 +43,15 @@ def import_export_parse_setup(subparser): '--mongorestore_path', default='mongorestore', help='mongorestore binary') subparser.add_argument( - '--extract_path', default='/tmp/mediagoblin-import', + '--extract_path', default='/tmp/mediagoblin/import', help='the directory to which the tarball should be extracted temporarily') + subparser.add_argument( + '--media_cache_path', default='/tmp/mediagoblin/mediaentries', + help='') def _export_database(db, args): print "\n== Exporting database ==\n" - + command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format( mongodump_path=args.mongodump_path, database=db.name, @@ -60,6 +64,13 @@ def _export_database(db, args): print "\n== Database exported ==\n" +def _export_media(db, args): + for entry in db.media_entries.find(): + storage = mg_util.import_component( + 'mediagoblin.storage:BasicFileStorage')() + print(storage.get_file(entry['media_files']['medium'])) + print(entry) + def _import_database(db, args): command = '{mongorestore_path} -d {database} -o {mongodump_cache}'.format( mongorestore_path=args.mongorestore_path, @@ -74,7 +85,7 @@ def env_import(args): tf = tarfile.open( args.tar_file, mode='r|gz') - + tf.extractall(args.extract_path) def env_export(args): @@ -91,6 +102,8 @@ def env_export(args): print "Aborting." return + _export_media(db, args) + tf = tarfile.open( args.tar_file, mode='w|gz') From d88e1d15c7c4903a696830155527f70e33b88c72 Mon Sep 17 00:00:00 2001 From: Caleb Forbes Davis V Date: Mon, 8 Aug 2011 00:10:46 -0500 Subject: [PATCH 019/134] Bug #488 - email validation assumes active login - loads username from user object instead of session to remove dependency on active 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 df7e2a88..19dafed0 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -157,7 +157,7 @@ def verify_email(request): return redirect( request, 'mediagoblin.user_pages.user_home', - user=request.user['username']) + user = user['username']) def resend_activation(request): From 58b79b159e15335a0d8c82ba329543088cabfd49 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 10:19:21 -0500 Subject: [PATCH 020/134] Just some indentation changes to the templates because I'm picky about such things :) --- .../templates/mediagoblin/auth/login.html | 19 ++++--- .../templates/mediagoblin/auth/register.html | 2 +- .../mediagoblin/auth/verification_email.txt | 8 +-- mediagoblin/templates/mediagoblin/base.html | 4 +- .../mediagoblin/edit/edit_profile.html | 6 ++- .../templates/mediagoblin/listings/tag.html | 4 +- mediagoblin/templates/mediagoblin/root.html | 15 +++--- .../mediagoblin/user_pages/gallery.html | 18 ++++--- .../mediagoblin/user_pages/media.html | 16 +++--- .../mediagoblin/user_pages/user.html | 50 +++++++++++-------- 10 files changed, 88 insertions(+), 54 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html index 8b1e2296..5750feb0 100644 --- a/mediagoblin/templates/mediagoblin/auth/login.html +++ b/mediagoblin/templates/mediagoblin/auth/login.html @@ -25,9 +25,11 @@

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

{% if login_failed %} -
{% trans %}Login failed!{% - endtrans %}
{% endif %} {{ - wtforms_util.render_divs(login_form) }} +
+ {% trans %}Login failed!{% endtrans %} +
+ {% endif %} + {{ wtforms_util.render_divs(login_form) }}
@@ -36,10 +38,13 @@ style="display: none;"/> {% endif %} {% if allow_registration %} -

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

{% endif - %} +

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

+ {% endif %}
{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index 5d512829..623cbdfd 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -28,7 +28,7 @@ {{ wtforms_util.render_divs(register_form) }}
+ class="button" />
diff --git a/mediagoblin/templates/mediagoblin/auth/verification_email.txt b/mediagoblin/templates/mediagoblin/auth/verification_email.txt index cb01600d..32053101 100644 --- a/mediagoblin/templates/mediagoblin/auth/verification_email.txt +++ b/mediagoblin/templates/mediagoblin/auth/verification_email.txt @@ -14,11 +14,13 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -#} +-#} -{% trans username=username, verification_url=verification_url %}Hi {{ username }}, +{% trans username=username, verification_url=verification_url|safe -%} +Hi {{ username }}, to activate your GNU MediaGoblin account, open the following URL in your web browser: -{{ verification_url|safe }}{% endtrans %} +{{ verification_url }} +{%- endtrans %} diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index b9c98ef6..986e0995 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -85,7 +85,9 @@ {% block mediagoblin_footer %}
{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index 4171cb4d..534e5f20 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -25,7 +25,11 @@ user['username'] }}" method="POST" enctype="multipart/form-data">
-

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

+

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

{{ wtforms_util.render_divs(form) }}
diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index 18123dbd..a013797f 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -36,6 +36,8 @@
{% trans %}atom feed{% endtrans %} + tag=tag_slug) }}"> + {%- trans %}atom feed{% endtrans -%} +
{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 3570374e..a4e19984 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -22,18 +22,21 @@ {% if request.user %}

- {% trans %}Submit an item{% endtrans %} + + {%- trans %}Submit an item{% endtrans -%} +

{% else %}

- {% trans login_url=request.urlgen('mediagoblin.auth.login') %}If you have an account, you can - Login.{% endtrans %} + {% trans login_url=request.urlgen('mediagoblin.auth.login') -%} + If you have an account, you can Login. + {%- endtrans %}

{% if allow_registration %}

- {% trans - register_url=request.urlgen('mediagoblin.auth.register') %}If you don't have an account, please - Register.{% endtrans %} + {% trans register_url=request.urlgen('mediagoblin.auth.register') -%} + If you don't have an account, please Register. + {%- endtrans %}

{% endif %} {% endif %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index 71f14da4..a66a547e 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -27,20 +27,24 @@ {% block mediagoblin_content -%} {% if user %}

- {% trans - username=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 %} +
{% else %} {# This *should* not occur as the view makes sure we pass in a user. #} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 2acf7a3d..afc0d903 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -38,13 +38,15 @@ {% endautoescape %}

- {% trans date="%4d-%02d-%02d"|format(media.created.year, - media.created.month, media.created.day), user_url= - request.urlgen('mediagoblin.user_pages.user_home',user= - media.uploader().username), - username=media.uploader().username %} - — uploaded on {{ date }} by {{ username }}{% endtrans %} + {% trans date="%4d-%02d-%02d"|format( + media.created.year, + media.created.month, media.created.day), + user_url=request.urlgen( + 'mediagoblin.user_pages.user_home', + user=media.uploader().username), + username=media.uploader().username -%} + — uploaded on {{ date }} by {{ username }} + {%- endtrans %}


diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index c3ad07db..1115fc56 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -36,11 +36,15 @@

{% trans %}Verification needed{% endtrans %}

-

{% trans %}Almost done! Your account still needs to be - verified.{% endtrans %}

- {% trans %}An email should arrive in a few moments with - instructions on how to do so.{% endtrans %} + {% trans -%} + Almost done! Your account still needs to be verified. + {%- endtrans %} +

+

+ {% trans -%} + An email should arrive in a few moments with instructions on how to do so. + {%- endtrans %}

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

@@ -53,30 +57,32 @@

{% trans %}Verification needed{% endtrans %}

- {% trans %}Someone has registered an account with this - username, but it still has to be verified.{% endtrans %} + {% trans -%} + Someone has registered an account with this username, but it still has to be verified. + {%- endtrans %}

- {% trans login_url=request.urlgen('mediagoblin.auth.login') - %}If you are that person but you've lost your verification - email, you can - log in and resend it.{% - endtrans %} + {% trans login_url=request.urlgen('mediagoblin.auth.login') -%} + If you are that person but you've lost your verification email, you can log in and resend it. + {%- endtrans %}

{% endif %} {# Active(?) (or at least verified at some point) user, horray! #} {% else %} -

{% trans username=user.username %}{{ username }}'s profile{% - endtrans %}

+

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

{% include "mediagoblin/utils/profile.html" %} {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %} {% trans %}Edit profile{% endtrans %} + user.username }}"> + {%- trans %}Edit profile{% endtrans -%} + {% endif %}
@@ -84,12 +90,16 @@ {% set pagination_base_url = user_gallery_url %} {% include "mediagoblin/utils/object_gallery.html" %}
-

{% trans - username=user.username %}View all of {{ username }}'s media{% - endtrans %}

- {% trans %}atom feed1{% - endtrans %} +

+ + {% trans username=user.username -%} + View all of {{ username }}'s media{% endtrans -%} + +

+ + {%- trans %}atom feed{% endtrans -%} +
From 4100798b86106832373b5afca77960edec5cdcc8 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 10:21:17 -0500 Subject: [PATCH 021/134] New extracted strings from the templates! --- .../i18n/en/LC_MESSAGES/mediagoblin.po | 200 ++++++++++++++++-- 1 file changed, 181 insertions(+), 19 deletions(-) diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 67830c2e..5e54390d 100644 --- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po @@ -1,26 +1,14 @@ -# Translations template for GNU MediaGoblin. -# -# 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 . +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2011. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: GNU MediaGoblin\n" -"POT-Creation-Date: 2011-08-06 23:01-0500\n" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-08-08 10:20-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,7 +17,181 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" + #: mediagoblin/templates/mediagoblin/root.html:21 msgid "Welcome to GNU MediaGoblin!" msgstr "" +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +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 +msgid "Cancel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +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:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to" +" be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + From 255f02c48623533f6e781d9d1eade12d18ee0745 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 8 Aug 2011 20:11:28 +0200 Subject: [PATCH 022/134] MountStorage: Add docs. --- mediagoblin/storage.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 25598c82..bbf1c034 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -287,6 +287,21 @@ class CloudFilesStorage(StorageInterface): class MountStorage(StorageInterface): + """ + Experimental "Mount" virtual Storage Interface + + This isn't an interface to some real storage, instead + it's a redirecting interface, that redirects requests + to other "StorageInterface"s. + For example, requests for ["store1", "a"] to first + storage with the path ["a"], etc. + + To set this up, you currently need to call the mount() + method with the target path and a backend, that shall + be available under that target path. + You have to mount things in a sensible order, + especially you can't mount ["a", "b"] before ["a"]. + """ def __init__(self, **kwargs): self.mounttab = {} From 620fca54727e37ba1b3e5ba745fdd7d7186dcafd Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 8 Aug 2011 21:51:11 +0200 Subject: [PATCH 023/134] MountStorage: Improve mounting asserts The asserts now differentiate between mounting on the same path and mounting over a shorter path. --- mediagoblin/storage.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index bbf1c034..88c748ce 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -313,13 +313,16 @@ class MountStorage(StorageInterface): print "Mounting:", repr(new_ent) already, rem_1, table, rem_2 = self._resolve_to_backend(new_ent, True) - print "===", repr(already), repr(rem_1), repr(rem_2) + print "===", repr(already), repr(rem_1), repr(rem_2), len(table) + + assert (len(rem_2) > 0) or (None not in table), \ + "That path is already mounted" + assert (len(rem_2) > 0) or (len(table)==0), \ + "A longer path is already mounted here" - assert (already is None) or (len(rem_2) > 0), "Already mounted" for part in rem_2: table[part] = {} table = table[part] - assert not table.has_key(None), "Huh? Already mounted?!" table[None] = backend def _resolve_to_backend(self, filepath, extra_info = False): From c65ea50fbd09842f9928a4879063ed5c343a73a2 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 19:52:14 -0500 Subject: [PATCH 024/134] Swedish translations updated to 100% --- .../i18n/de/LC_MESSAGES/mediagoblin.po | 179 +++++++++++++++++- 1 file changed, 177 insertions(+), 2 deletions(-) diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 715757fb..0303ec12 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/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-08-06 23:01-0500\n" -"PO-Revision-Date: 2011-08-07 14:06+0000\n" +"POT-Creation-Date: 2011-08-08 10:20-0500\n" +"PO-Revision-Date: 2011-08-08 15:22+0000\n" "Last-Translator: cwebber \n" "Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n" "MIME-Version: 1.0\n" @@ -18,8 +18,183 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" + #: mediagoblin/templates/mediagoblin/root.html:21 msgid "Welcome to GNU MediaGoblin!" msgstr "Willkommen bei GNU MediaGoblin!" +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +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 +msgid "Cancel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +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:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + From 4d989b5eaff0490b13a9698a598b7bc678901eb1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 19:53:40 -0500 Subject: [PATCH 025/134] Compiled the new Swedish translations. I know Elrond wants 'no compiled crap in our repository' but until I have a better solution... --- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 602 -> 3688 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index ba6256234c243d76d87ef64c1363068aff62f8a7..c403e3cc1e98f59c087bc732986a57d6b25cac1b 100644 GIT binary patch literal 3688 zcmeH}&u<$=6vwAfKwW;SNFaU)#zAQl)oVMEii+E$v}p*1q(n(t!~sR)-Di7XJ!8$x z#dfCFqjFpWWIszF$Fl{pe+#l+*Fe_m z2FQAS53*jjK-TNr;~+q(m@|Gz;AM(D)$PJo!Yco$^l)=w=?_C8Zrix|scRUY7JH72R3(7 zC5g>VkUr=vlZGhuGFaInxkFC3HKjFi&PeJhok`!dd6r7$oZca+ja0Ht1KG1ZGQrD% z4qe>!!R1NN)_7@+?AievOs({`CYF>*C=*MLR3NEfq4ZxF-$G=vOO7hyf;Gp3>?(NL z>nDd4&Whz!hg}W0p-o3l&lGdq4mxB|spwSRzpr#FmoCdS7G=e@GHt}$8W#3?R-*_} zE6ihuBOS6<`-Y5TuS(k|BSV*D+h&;^u-D5QtB@ip#to0a^qy%7`55>uDN~7_TT_lIogp4BNKLtHBK#g z#MKmdjQAPjt8619DXoZN5oJ)F4y8p3Hp^R`VqKwI$BK13Ku)EyHQbv?H-vt(UN4fS z>|3+0GqpI86dX?#NxrM^s7y_hH6VkA;F zH`wEwd8?W!O)M&rhi+^CvdDJn#n$3^L&R9w+02nwadw(r_cyCvv-$`Z_u zW81f%DnbR@Lq&m^Lcn2}??vsYi1kwD_+lEvvB%zN?za$aP~W-`ulbHnsBcqdA`Y^gG#{pFh#SCt6iL#9K}opJAG=DHD{17PLGw`txR*`!Gy0o2Q&y zix^=#x$027MXHCnlIvkzW=69a3_dt`S0P`fv^mW=>pX>p zJhbCed;K`HHo17&BsN7wY|2wD9ikO7?Q p7?qZy06h2zL8U)9;||Wa|HB!Fcj=F94{ybIk=FZ9sRx{M{{j-PON#&i delta 125 zcmaDMbBiVXo)F7a1|VPpVi_RT0dbIk4UjDj#I`{EfRTYA5=hGfu@y)|cxp~^er~El zNxp)+U#Nm_YD#9Jdwx<*X5QpF_8xXK1tViC1H;LJ9E$Ab3Wg?D24 Date: Tue, 9 Aug 2011 03:09:42 +0200 Subject: [PATCH 026/134] Feature 298 - Create environment tarball Saving changes. --- mediagoblin/gmg_commands/import_export.py | 109 +++++++++++++++++----- 1 file changed, 88 insertions(+), 21 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index c05a48d9..2c626da1 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -20,11 +20,15 @@ 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 import util as mg_util +from mediagoblin.storage import BasicFileStorage +from mediagoblin.init import setup_storage, setup_global_and_app_config import shlex import tarfile import subprocess import os.path +import os +import re def import_export_parse_setup(subparser): # TODO: Add default @@ -33,9 +37,6 @@ def import_export_parse_setup(subparser): subparser.add_argument( '-cf', '--conf_file', default='mediagoblin.ini', help='Config file used to set up environment') - subparser.add_argument( - '--mongodump_cache', default='/tmp/mediagoblin/mongodump', - help='mongodump cache directory') subparser.add_argument( '--mongodump_path', default='mongodump', help='mongodump binary') @@ -43,10 +44,7 @@ def import_export_parse_setup(subparser): '--mongorestore_path', default='mongorestore', help='mongorestore binary') subparser.add_argument( - '--extract_path', default='/tmp/mediagoblin/import', - help='the directory to which the tarball should be extracted temporarily') - subparser.add_argument( - '--media_cache_path', default='/tmp/mediagoblin/mediaentries', + '--cache_path', default='/tmp/mediagoblin/', help='') def _export_database(db, args): @@ -55,7 +53,7 @@ def _export_database(db, args): command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format( mongodump_path=args.mongodump_path, database=db.name, - mongodump_cache=args.mongodump_cache) + mongodump_cache=args._cache_path['database']) p = subprocess.Popen( shlex.split(command)) @@ -65,19 +63,38 @@ def _export_database(db, args): print "\n== Database exported ==\n" def _export_media(db, args): + + print "\n== Exporting media ==\n" + + media_cache = BasicFileStorage( + args._cache_path['media']) + for entry in db.media_entries.find(): - storage = mg_util.import_component( - 'mediagoblin.storage:BasicFileStorage')() - print(storage.get_file(entry['media_files']['medium'])) + for name, path in entry['media_files'].items(): + mc_file = media_cache.get_file(path, mode='wb') + mc_file.write( + mg_globals.public_store.get_file(path, mode='rb').read()) + + print(mc_file) print(entry) + queue_cache = BasicFileStorage( + args._cache_path['queue']) + + qc_file = queue_cache.get_file(entry['queued_media_file'], mode='wb') + qc_file.write( + mg_globals.queue_store.get_file(entry['queued_media_file'], mode='rb').read()) + print(qc_file) + + print "\n== Media exported ==\n" + def _import_database(db, args): command = '{mongorestore_path} -d {database} -o {mongodump_cache}'.format( mongorestore_path=args.mongorestore_path, database=db.name, mongodump_cache=args.mongodump_cache) -def env_import(args): +def env_import(args): config, validation_result = read_mediagoblin_config(args.conf_file) connection, db = setup_connection_and_db_from_config( config['mediagoblin'], use_pymongo=True) @@ -88,7 +105,63 @@ def env_import(args): tf.extractall(args.extract_path) +def _setup_paths(args): + args._cache_path = dict() + PATH_MAP = { + 'media': 'media', + 'queue': 'queue', + 'database': 'database'} + + for key, val in PATH_MAP.items(): + args._cache_path[key] = os.path.join(args.cache_path, val) + + return args + +def _create_archive(args): + print "\n== Compressing to archive ==\n" + tf = tarfile.open( + args.tar_file, + mode='w|gz') + with tf: + for root, dirs, files in os.walk(args.cache_path): + print root, dirs, files + + everything = [] + everything.extend(dirs) + everything.extend(files) + + print everything + + for d in everything: + directory_path = os.path.join(root, d) + virtual_path = os.path.join( + root.replace(args.cache_path, 'mediagoblin-data/'), d) + + # print 'dir', directory_path, '\n', 'vir', virtual_path + + tarinfo = tf.gettarinfo( + directory_path, + arcname=virtual_path) + + tf.addfile(tarinfo) + + print 'added ', d + + ''' + mg_data = tf.gettarinfo( + args.cache_path, + arcname='mediagoblin-data') + + tf.addfile(mg_data) + ''' + print "\n== Archiving done ==\n" + def env_export(args): + args = _setup_paths(args) + + setup_global_and_app_config(args.conf_file) + setup_storage() + config, validation_result = read_mediagoblin_config(args.conf_file) connection, db = setup_connection_and_db_from_config( config['mediagoblin'], use_pymongo=True) @@ -102,14 +175,8 @@ def env_export(args): print "Aborting." return + _export_database(db, args) + _export_media(db, args) - tf = tarfile.open( - args.tar_file, - mode='w|gz') - - - _export_database(db, args) - - tf.add(args.mongodump_cache) - + _create_archive(args) From 8951f822bf40a0808674b08e7fc81baf73ee260a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:26:30 -0500 Subject: [PATCH 027/134] Actually I did *not* successfully check in our new languages (sr and sv); now fixed :) --- .../i18n/sr/LC_MESSAGES/mediagoblin.po | 199 ++++++++++++++++ .../i18n/sv/LC_MESSAGES/mediagoblin.po | 214 ++++++++++++++++++ 2 files changed, 413 insertions(+) create mode 100644 mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..b5a6f2d3 --- /dev/null +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,199 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 10:20-0500\n" +"PO-Revision-Date: 2011-08-09 03:25+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\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: 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/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +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 +msgid "Cancel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +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:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + + diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..8899a3ea --- /dev/null +++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,214 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 10:20-0500\n" +"PO-Revision-Date: 2011-08-09 00:35+0000\n" +"Last-Translator: joar \n" +"Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\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: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "MediaGoblin logo" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Ladda upp" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "Verifiera din e-postadress!" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Logga in" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Drivs av MediaGoblin, ett project " +"från GNU" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Välkommen till GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "Ladda upp" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "Har du ett konto? Logga in." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" +"Har du inget konto? Registrera ett konto." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Logga in" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Inloggning misslyckades!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "Skicka" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "Har du inget konto?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Skapa ett!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Skapa ett konto!" + +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Skickade ett nytt verifierings-email." + +#: 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 "" +"Hej %(username)s,\n" +"\n" +"oppna den följande URLen i din webbläsare för att aktivera ditt konto på GNU MediaGoblin:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Redigerar %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Avbryt" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Spara" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Redigerar %(username)ss profil" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "Taggat med:" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "atom-feed" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Ladda upp" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "%(username)ss media" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "Finns ingen sådan användare ännu." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "Verifiering krävs" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "Nästan klart! Nu behöver du bara verifiera ditt konto." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +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:49 +msgid "In case it doesn't:" +msgstr "Om det inte skulle göra det:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "Skicka ett nytt e-postmeddelande" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" +"Det finns redan ett konto med det här användarnamnet, men det behöver " +"verifieras." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, python-format +msgid "" +"If you are that person but you've lost your verification email, you can log in and resend it." +msgstr "" +"Om det är du som är den personen och har förlorat ditt e-postmeddelande med " +"detaljer om hur du verifierar ditt konto så kan du logga in och begära ett nytt." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)ss profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "Redigera profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "Se all media från %(username)s" + + From 956ba354c9c79384250e85ad4d9f16900503921b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:27:26 -0500 Subject: [PATCH 028/134] Once again compiling .po to .mo --- mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 3752 bytes mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 3767 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..cb07e1d0835f00a0fb97666fdbe3062b8227a5eb GIT binary patch literal 3752 zcmeH}&u<$=6vwAfT45-lB7uMkULx{KWbJiIQM-*((k2Z-PKc7Uhy#k&-tl_SddHfX zjcciuIDjhA6H+VnALt1V2(CR;f;$Hea4Hu#!4V0G3w+oNFMy;uBnsfuDgK z_cq9JzX03dUGODv3`Vbk=RnS53%m>_Am{fjh_ASh%QN7wAkX^)WPgW_7V(dRgz-4| z3b+J52{u8F-vM8T79WGG*Bv}$z3zgn*Y6rasNI{H+h*QX%s^*6|Rt-_e~`W)nS-2owm_!4Bjz6Lq&J&@!60J2`cfUMUF zCb3>Ih+E=1$a>ubIltdP_Im_kv0le;;dv)O_BRD``~W0y6=c0M$a>uXIsPqBj7?@% znl$XlDLY}QYjjH`Qp|?bHnLS4EuL>>CYiFMb9-mcR>C=0bY!GLF`sm_brk7Tj?f1> zGZZ$PI!hf{r;>zHDI-fxQ$y0WG^(X!R2K6o$xf&evTdCu5rxL6ZAmJnkXo`w9o>#1rNJ3 zr%NSd9bz5ZoN1r6+GjG%eVTMvrsUd^S~^K|kE32%uS1GbZr76yY8c%^1%py)Y_d?c z8L~!2$;5JtLqJ&xKOq(;jfHrP%<=sRXpnH>a(8>pi^5Fj#!bkyry&v@tAYE`ISh~v z_X5O>$Ve*z<;ugzXo-i_o~CXhLn~>oUn65>oixK{TOW+s`Hs7NWqWjjbM&HUPN+X9Lp$g!JxPm=XHf{u@-B(hn|Y4(cfK3+qrH~ zspL&l%q?pZkIwCB3eIO5O}?Y*z$Q*Jo?986`4W zpT*YO)Bz2u*1)*j(z>Zlx135>85GX$?SYE2Hj}or_THwKpHhh9E#L?UXvVKrJ^wVm zRP}=y-}6uTJ|=qWa$9je`{$h@|70+8>J1;CQa!ZJ+caTn6D-pNbn#NXPOI}Pi!{5q zGQV7ZdwyYIeQ{%B4pY-O3uEbR%CHmAhBOU@icAjH(d+ffjvc9%yz<~ex(_VH!MtKk zWvaB6WF}0!i`sN-KxsE0+Sx6Hkpo9{aUR`JH0!P7uk}=TTGie!l@e2>4tKpC7DWtlAy%>fX;^vnUG&TQ+}&-@SYsL g&kx>{gMVNK$5VcYJo+_+x5dGG^58xBe|}H?15eCV>i_@% literal 0 HcmV?d00001 diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..e300ae89d0b8fc62abab1aa603c44cbcc1bcaf4c GIT binary patch literal 3767 zcma);&u=706~`+Oeq{I&w4e}v=8c7SZN)t^-e_SnS$oN@on0gE#@LP{4#}!!x~985 z-Bqos>Y0p`l{g@f;DiLy3M3BTU8&k7pecYdoK+ z?&?>szVE$y{qBXwf6nlC5&vJs|L$XMbo%$^M;Lnw!~0+x{26!!{3G}s@W0^4!R?PS zb^+W4KL_3ezYON!r@^0qUj!e3Uk85=J_-IAybt~ZoPe)A&e&b>uiy>v;>Q^KJeYuP zo%<9Sz4ESTvt@{9U>;4vu!9Rds0+;d7GvIa5`Ed_C0#nfWHwE!w@8avT;J-jO z??0fk_t+=O^)G;g@kQ_};4Sb8un)TRGw|=w?)%^uFn%33Tc822g1-ixUVj7KdKVj| z{Q$&=ZQ{%Aa|d*~yaqb|GtlYvqw4zG;14l=2)+Yue2TH#;CtY=z%4lcHSkUFli)8Z z{sw#+= zBqbB8A`OXaos0w}k~j^-m@<_KX$_4N8{?|6y6D?PNkd9ftj5k@sK}@myUAr=r0k{^ z+zR5bP_EysFTpd4g%(Y=rQ{_`F~>@$^JpUMb+#QQcBX+FBr>Aq6~D)OHnAyG@{`Kz z=Sp|$?kjZ1iE>Nz(nPY`2`rq>Tx&GoHOD?i&eMt0YT=RE_cc{fkc ze-~0T{BvW`qn=h{M6lavEU%Qx_PNuj3>n)QxFw*hfE|v_32h)=udwd=C1{Ykz0v+#pt^-f(}e4t%ZII5AY`?3&LO zh*p+zj7Jv>`9NtsStE&BEc&s35-D3q)c8Ts%Mx3`EtFW1)kCjQJ(vhxohC>Agedda z9~~lOM+puDj-x~k&eYTF2zphdeeBNpwop$^#;wY5qQHz7a8l;GKYN;Nuar612?H!_ zP&?g43ypn|D{X^2CQ8EKMiH6dP<5$_S`XvaK&igcc}oi0t^#M~bD*6VQwY=8d-*W% zrxex+wr~V=>2ha%J?LD;ht@mY%blQerPIO0U|)<9=g;E2=c&`_K6mBW4*nXu+}Pky zb7@j+Q+MfDaZT5(yOIpV8{ZzIFnh?VmJyqnEu(@*A~+O0>(ap(CzXk5rP|7PJZ{aN zJiC|t%x)|mZ<|qjwXv5Lny0}_N@u1^GWSEXarp(*xVy8lBB{AS>#L1BJ9oBEC0=iJ z8aI`+IN^iCNe&&Xcmvv{JdrQBgw;majlvFstEcnarUpU>+p@1h9EV-H+DmNXmXJb2 zOT=cm>$rd-=5-7V0@;^{-=5{3B9 zHLsf*exYkv8e(JUO56A;f*dC-GCdS2A|YIkSIunb4r&+~sw@LIX2(2}=)KCojysu< zw?kwedgZ96C#a(#&pC;DiRS5rCcBNe!ym{ZDi5yXbbuXbQ+2i3SU=L%>Y46NUHYqL zCfPzwvD@PK%tZ7xmFMt1M9UgXAEw8CvuIZsC)kZ7w5whUDLI-EW|SM|5CKBY>qhzX zt;Gs_zy9`eh6OE6PyE&mJqk1q{XL%#hQc z7zsSYXck&BaB+x~z=XMELQgo;8Y7NqxbxdP(GwAzE2AeT7C}8HV)N$e6Z&jN)K0Bg z29&L>GBmq-ecsF&uh8jcUbR>yUxG3uGc3|nP=v_1D3;C9&vosw{IMfpERya;B*TH0 zPWnS03e#kVXp>MDxm|V1^6jVWl3RGKGsH)yPJQSe>2_2dr!>&hx8~kN&g+@JR~`%# zxaB2sGCxv*s2Mi_rRc2tDRq#sF%$T{fX Date: Mon, 8 Aug 2011 22:32:28 -0500 Subject: [PATCH 029/134] We should pass ugettext instead of gettext into the jinja template env Otherwise we might get UnicodeDecodeErrors :) --- mediagoblin/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/util.py b/mediagoblin/util.py index c9f4a0ac..d26dc6dc 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -93,7 +93,7 @@ def get_jinja_env(template_loader, locale): extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape']) template_env.install_gettext_callables( - mg_globals.translations.gettext, + mg_globals.translations.ugettext, mg_globals.translations.ngettext) # All templates will know how to ... From 1eec9c88445ca73e4b237ce39190fda0775fc4f1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:49:35 -0500 Subject: [PATCH 030/134] mediagoblin/translations/ directory not used, mediagoblin/i18n/ is; removing former --- .../en/LC_MESSAGES/mediagoblin.mo | Bin 502 -> 0 bytes .../en/LC_MESSAGES/mediagoblin.po | 23 ------------------ 2 files changed, 23 deletions(-) delete mode 100644 mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo delete mode 100644 mediagoblin/translations/en/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo b/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo deleted file mode 100644 index fb7046cdd069d85b478d03ce838a08b13736f58b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmaJ;%TB^T6s^Wpmu_`&*=gcn+eCu{CAC;T}Vev5;e zpc`&-l5>)i`#AUW^yJ+#b!>2MaJ3VEs$uwhMGT3jq}$+)FzeM!`M>x9ZqkDKrYR$98QF()g;c*9GIE4(St9C2D`8m!!7$?e<-w lB7sO{#zjt{w&2, 2011. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-05-12 22:28-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \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" - -#: mediagoblin/templates/mediagoblin/root.html:22 -msgid "Welcome to GNU MediaGoblin!" -msgstr "" - From 03e5bd6d352f9479eefd3c7ad1f39137bd9ba17d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:51:03 -0500 Subject: [PATCH 031/134] Provide a pass_to_ugettext method and set up gettext to default to English. --- mediagoblin/util.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mediagoblin/util.py b/mediagoblin/util.py index d26dc6dc..ed7be841 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -478,6 +478,22 @@ def setup_gettext(locale): translations=this_gettext) +# Force en to be setup before anything else so that +# mg_globals.translations is never None +setup_gettext('en') + + +def pass_to_ugettext(*args, **kwargs): + """ + Pass a translation on to the appropriate ugettext method. + + The reason we can't have a global ugettext method is because + mg_globals gets swapped out by the application per-request. + """ + return mg_globals.translations.ugettext( + *args, **kwargs) + + PAGINATION_DEFAULT_PER_PAGE = 30 class Pagination(object): From 4b1adc132cf45507e2f910122992230d428c6856 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:53:39 -0500 Subject: [PATCH 032/134] Marked relevant strings in python views/forms for translation via ugettext --- mediagoblin/auth/forms.py | 16 +++++++++------- mediagoblin/auth/views.py | 18 ++++++++++-------- mediagoblin/edit/forms.py | 17 ++++++++++------- mediagoblin/edit/views.py | 7 ++++--- mediagoblin/submit/forms.py | 8 +++++--- mediagoblin/submit/views.py | 7 ++++--- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index 7bc0aeb1..1b6bc7c2 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -16,34 +16,36 @@ import wtforms +from mediagoblin.util import pass_to_ugettext as _ + class RegistrationForm(wtforms.Form): username = wtforms.TextField( - 'Username', + _('Username'), [wtforms.validators.Required(), wtforms.validators.Length(min=3, max=30), wtforms.validators.Regexp(r'^\w+$')]) password = wtforms.PasswordField( - 'Password', + _('Password'), [wtforms.validators.Required(), wtforms.validators.Length(min=6, max=30), wtforms.validators.EqualTo( 'confirm_password', - 'Passwords must match.')]) + _('Passwords must match.'))]) confirm_password = wtforms.PasswordField( - 'Confirm password', + _('Confirm password'), [wtforms.validators.Required()]) email = wtforms.TextField( - 'Email address', + _('Email address'), [wtforms.validators.Required(), wtforms.validators.Email()]) class LoginForm(wtforms.Form): username = wtforms.TextField( - 'Username', + _('Username'), [wtforms.validators.Required(), wtforms.validators.Regexp(r'^\w+$')]) password = wtforms.PasswordField( - 'Password', + _('Password'), [wtforms.validators.Required()]) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index df7e2a88..121a8c8e 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -21,6 +21,7 @@ from webob import exc from mediagoblin import messages from mediagoblin import mg_globals from mediagoblin.util import render_to_response, redirect +from mediagoblin.util import pass_to_ugettext as _ from mediagoblin.db.util import ObjectId from mediagoblin.auth import lib as auth_lib from mediagoblin.auth import forms as auth_forms @@ -36,7 +37,7 @@ def register(request): messages.add_message( request, messages.WARNING, - ('Sorry, registration is disabled on this instance.')) + _('Sorry, registration is disabled on this instance.')) return redirect(request, "index") register_form = auth_forms.RegistrationForm(request.POST) @@ -51,7 +52,7 @@ def register(request): if users_with_username: register_form.username.errors.append( - u'Sorry, a user with that name already exists.') + _(u'Sorry, a user with that name already exists.')) else: # Create the user @@ -148,12 +149,13 @@ def verify_email(request): messages.add_message( request, messages.SUCCESS, - ('Your email address has been verified. ' - 'You may now login, edit your profile, and submit images!')) + _("Your email address has been verified. " + "You may now login, edit your profile, and submit images!")) else: - messages.add_message(request, - messages.ERROR, - 'The verification key or user id is incorrect') + messages.add_message( + request, + messages.ERROR, + _('The verification key or user id is incorrect')) return redirect( request, 'mediagoblin.user_pages.user_home', @@ -174,7 +176,7 @@ def resend_activation(request): messages.add_message( request, messages.INFO, - 'Resent your verification email.') + _('Resent your verification email.')) return redirect( request, 'mediagoblin.user_pages.user_home', user=request.user['username']) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index a1783a72..8052f482 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -16,25 +16,28 @@ import wtforms + from mediagoblin.util import tag_length_validator, TOO_LONG_TAG_WARNING +from mediagoblin.util import pass_to_ugettext as _ class EditForm(wtforms.Form): title = wtforms.TextField( - 'Title', + _('Title'), [wtforms.validators.Length(min=0, max=500)]) slug = wtforms.TextField( - 'Slug', - [wtforms.validators.Required(message="The slug can't be empty")]) + _('Slug'), + [wtforms.validators.Required(message=_("The slug can't be empty"))]) description = wtforms.TextAreaField('Description of this work') tags = wtforms.TextField( - 'Tags', + _('Tags'), [tag_length_validator]) class EditProfileForm(wtforms.Form): - bio = wtforms.TextAreaField('Bio', + bio = wtforms.TextAreaField( + _('Bio'), [wtforms.validators.Length(min=0, max=500)]) url = wtforms.TextField( - 'Website', + _('Website'), [wtforms.validators.Optional(), - wtforms.validators.URL(message='Improperly formed URL')]) + wtforms.validators.URL(message=_('Improperly formed URL'))]) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 5cbaadb5..0b1a98f1 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -23,6 +23,7 @@ from mediagoblin import mg_globals from mediagoblin.util import ( render_to_response, redirect, clean_html, convert_to_tag_list_of_dicts, media_tags_as_string, cleaned_markdown_conversion) +from mediagoblin.util import pass_to_ugettext as _ from mediagoblin.edit import forms from mediagoblin.edit.lib import may_edit_media from mediagoblin.decorators import require_active_login, get_user_media_entry @@ -50,7 +51,7 @@ def edit_media(request, media): if existing_user_slug_entries: form.slug.errors.append( - u'An entry with that slug already exists for this user.') + _(u'An entry with that slug already exists for this user.')) else: media['title'] = request.POST['title'] media['description'] = request.POST.get('description') @@ -71,7 +72,7 @@ def edit_media(request, media): and request.method != 'POST': messages.add_message( request, messages.WARNING, - "You are editing another user's media. Proceed with caution.") + _("You are editing another user's media. Proceed with caution.")) return render_to_response( @@ -92,7 +93,7 @@ def edit_profile(request): if request.method != 'POST': messages.add_message( request, messages.WARNING, - "You are editing a user's profile. Proceed with caution.") + _("You are editing a user's profile. Proceed with caution.")) else: user = request.user diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index f02c95a6..ccb62a03 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -16,15 +16,17 @@ import wtforms + from mediagoblin.util import tag_length_validator +from mediagoblin.util import pass_to_ugettext as _ class SubmitStartForm(wtforms.Form): title = wtforms.TextField( - 'Title', + _('Title'), [wtforms.validators.Length(min=0, max=500)]) description = wtforms.TextAreaField('Description of this work') - file = wtforms.FileField('File') + file = wtforms.FileField(_('File')) tags = wtforms.TextField( - 'Tags', + _('Tags'), [tag_length_validator]) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 87e57dda..ba13b755 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -23,6 +23,7 @@ from werkzeug.utils import secure_filename from mediagoblin.util import ( render_to_response, redirect, cleaned_markdown_conversion, \ convert_to_tag_list_of_dicts) +from mediagoblin.util import pass_to_ugettext as _ from mediagoblin.decorators import require_active_login from mediagoblin.submit import forms as submit_forms, security from mediagoblin.process_media import process_media_initial @@ -41,10 +42,10 @@ def submit_start(request): and isinstance(request.POST['file'], FieldStorage) and request.POST['file'].file): submit_form.file.errors.append( - u'You must provide a file.') + _(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!') + _(u"The file doesn't seem to be an image!")) else: filename = request.POST['file'].filename @@ -92,7 +93,7 @@ def submit_start(request): # queue it for processing process_media_initial.delay(unicode(entry['_id'])) - add_message(request, SUCCESS, 'Woohoo! Submitted!') + add_message(request, SUCCESS, _('Woohoo! Submitted!')) return redirect(request, "mediagoblin.user_pages.user_home", user = request.user['username']) From d1e67890da02f29a8fc4605c2f6601526fcacf35 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 8 Aug 2011 22:56:16 -0500 Subject: [PATCH 033/134] Extracted translatable strings from python files. --- .../i18n/en/LC_MESSAGES/mediagoblin.po | 105 +++++++++++++++++- 1 file changed, 100 insertions(+), 5 deletions(-) diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 5e54390d..0de5ca62 100644 --- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-08-08 10:20-0500\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,105 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your " +"profile, and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "" + #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" msgstr "" @@ -90,10 +189,6 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 -msgid "Resent your verification email." -msgstr "" - #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format msgid "" From ed7970696e3194fdfc9fb597342e2cecacc75935 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 31 Jul 2011 13:54:07 +0200 Subject: [PATCH 034/134] Storage Config: Use own section Instead of configuring storage X by parameters in the main section "X_class = backend" and "X_param = value", use a new section in the config: "[storage:X]" and use "class = backend" and "param = value" there. This is the beginning, it includes a try at being backward compatible. But that try isn't really fully useful anyway. --- mediagoblin.ini | 10 +++++++--- mediagoblin/config_spec.ini | 12 +++++++----- mediagoblin/init/__init__.py | 18 ++++++++++++++++-- mediagoblin/storage.py | 7 ++++++- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/mediagoblin.ini b/mediagoblin.ini index e889646a..c22d12d7 100644 --- a/mediagoblin.ini +++ b/mediagoblin.ini @@ -1,7 +1,4 @@ [mediagoblin] -queuestore_base_dir = %(here)s/user_dev/media/queue -publicstore_base_dir = %(here)s/user_dev/media/public -publicstore_base_url = /mgoblin_media/ direct_remote_path = /mgoblin_static/ email_sender_address = "notice@mediagoblin.example.org" @@ -14,5 +11,12 @@ allow_registration = true ## Uncomment this to put some user-overriding templates here #local_templates = %(here)s/user_dev/templates/ +[storage:queuestore] +base_dir = %(here)s/user_dev/media/queue + +[storage:publicstore] +base_dir = %(here)s/user_dev/media/public +base_url = /mgoblin_media/ + [celery] # Put celery stuff here diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index bbc1f7d6..6e0d52b4 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -4,15 +4,10 @@ db_host = string() db_name = string(default="mediagoblin") db_port = integer() -# -queuestore_base_dir = string(default="%(here)s/user_dev/media/queue") -publicstore_base_dir = string(default="%(here)s/user_dev/media/public") # Where temporary files used in processing and etc are kept workbench_path = string(default="%(here)s/user_dev/media/workbench") -# -publicstore_base_url = string(default="/mgoblin_media/") # Where mediagoblin-builtin static assets are kept direct_remote_path = string(default="/mgoblin_static/") @@ -37,6 +32,13 @@ local_templates = string() # itself) celery_setup_elsewhere = boolean(default=False) +[storage:publicstore] +base_dir = string(default="%(here)s/user_dev/media/public") +base_url = string(default="/mgoblin_media/") + +[storage:queuestore] +base_dir = string(default="%(here)s/user_dev/media/queue") + [celery] # known booleans celery_result_persistent = boolean() diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index ff005703..b87bd7a4 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -113,9 +113,23 @@ def get_staticdirector(app_config): def setup_storage(): app_config = mg_globals.app_config + global_config = mg_globals.global_config - public_store = storage_system_from_config(app_config, 'publicstore') - queue_store = storage_system_from_config(app_config, 'queuestore') + key_short = 'publicstore' + key_long = "storage:" + key_short + if global_config.has_key(key_long): + print "New style" + public_store = storage_system_from_config(global_config[key_long], None) + else: + print "old style" + public_store = storage_system_from_config(app_config, key_short) + + key_short = 'queuestore' + key_long = "storage:" + key_short + if global_config.has_key(key_long): + queue_store = storage_system_from_config(global_config[key_long], None) + else: + queue_store = storage_system_from_config(app_config, key_short) setup_globals( public_store = public_store, diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 88c748ce..46a0c040 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -472,7 +472,10 @@ def storage_system_from_config(paste_config, storage_prefix): base_url='/media/', base_dir='/var/whatever/media') """ - prefix_re = re.compile('^%s_(.+)$' % re.escape(storage_prefix)) + if storage_prefix is not None: + prefix_re = re.compile('^%s_(.+)$' % re.escape(storage_prefix)) + else: + prefix_re = re.compile('^(.+)$') config_params = dict( [(prefix_re.match(key).groups()[0], value) @@ -485,5 +488,7 @@ def storage_system_from_config(paste_config, storage_prefix): else: storage_class = "mediagoblin.storage:BasicFileStorage" + print storage_class, repr(config_params) + storage_class = util.import_component(storage_class) return storage_class(**config_params) From f7d73aeb34ed16c7d1aa06d977ffb4c9c7a44051 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 7 Aug 2011 17:41:24 +0200 Subject: [PATCH 035/134] storage Config: Stop being backward compatible (beginning). Chris Webber says "no backward compatibility for this". So start removing the backward compat stuff. --- mediagoblin/init/__init__.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index b87bd7a4..32f0194c 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -117,19 +117,11 @@ def setup_storage(): key_short = 'publicstore' key_long = "storage:" + key_short - if global_config.has_key(key_long): - print "New style" - public_store = storage_system_from_config(global_config[key_long], None) - else: - print "old style" - public_store = storage_system_from_config(app_config, key_short) + public_store = storage_system_from_config(global_config[key_long], None) key_short = 'queuestore' key_long = "storage:" + key_short - if global_config.has_key(key_long): - queue_store = storage_system_from_config(global_config[key_long], None) - else: - queue_store = storage_system_from_config(app_config, key_short) + queue_store = storage_system_from_config(global_config[key_long], None) setup_globals( public_store = public_store, From 56fc71865919792159ce4307101ef246488b4194 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 9 Aug 2011 13:11:34 +0200 Subject: [PATCH 036/134] Storage config: Drop all Backward Compatibility Chris Webber says not to care about backward compatibility at this stage. So drop the last bits. --- mediagoblin/init/__init__.py | 5 ++--- mediagoblin/storage.py | 14 ++++---------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 32f0194c..44f604b1 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -112,16 +112,15 @@ def get_staticdirector(app_config): def setup_storage(): - app_config = mg_globals.app_config global_config = mg_globals.global_config key_short = 'publicstore' key_long = "storage:" + key_short - public_store = storage_system_from_config(global_config[key_long], None) + public_store = storage_system_from_config(global_config[key_long]) key_short = 'queuestore' key_long = "storage:" + key_short - queue_store = storage_system_from_config(global_config[key_long], None) + queue_store = storage_system_from_config(global_config[key_long]) setup_globals( public_store = public_store, diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 46a0c040..66acc1d4 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -443,7 +443,7 @@ def clean_listy_filepath(listy_filepath): return cleaned_filepath -def storage_system_from_config(paste_config, storage_prefix): +def storage_system_from_config(config): """ Utility for setting up a storage system from the paste app config. @@ -472,15 +472,9 @@ def storage_system_from_config(paste_config, storage_prefix): base_url='/media/', base_dir='/var/whatever/media') """ - if storage_prefix is not None: - prefix_re = re.compile('^%s_(.+)$' % re.escape(storage_prefix)) - else: - prefix_re = re.compile('^(.+)$') - - config_params = dict( - [(prefix_re.match(key).groups()[0], value) - for key, value in paste_config.iteritems() - if prefix_re.match(key)]) + # This construct is needed, because dict(config) does + # not replace the variables in the config items. + config_params = dict(config.iteritems()) if 'storage_class' in config_params: storage_class = config_params['storage_class'] From f9b68f6efa8624a425464a62d5a836167f5e000e Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 9 Aug 2011 13:40:20 +0200 Subject: [PATCH 037/134] Storage Config: Finally drop debug --- mediagoblin/storage.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 66acc1d4..d338fb31 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -482,7 +482,5 @@ def storage_system_from_config(config): else: storage_class = "mediagoblin.storage:BasicFileStorage" - print storage_class, repr(config_params) - storage_class = util.import_component(storage_class) return storage_class(**config_params) From 7bc2d2e313336759d77e4dbf9f4a6ced711a5bf1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 9 Aug 2011 09:41:16 -0500 Subject: [PATCH 038/134] New translations including Swedish at 100% (again! now with python strings) --- .../i18n/de/LC_MESSAGES/mediagoblin.po | 107 ++++++++++++++++- .../i18n/sr/LC_MESSAGES/mediagoblin.po | 109 ++++++++++++++++-- .../i18n/sv/LC_MESSAGES/mediagoblin.po | 109 +++++++++++++++++- 3 files changed, 306 insertions(+), 19 deletions(-) diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 0303ec12..065a28b8 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/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-08-08 10:20-0500\n" -"PO-Revision-Date: 2011-08-08 15:22+0000\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-09 03:57+0000\n" "Last-Translator: cwebber \n" "Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,105 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "" + #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" msgstr "" @@ -91,10 +190,6 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 -msgid "Resent your verification email." -msgstr "" - #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format msgid "" diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index b5a6f2d3..ec8611ee 100644 --- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po @@ -6,9 +6,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-08-08 10:20-0500\n" -"PO-Revision-Date: 2011-08-09 03:25+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-09 03:57+0000\n" +"Last-Translator: cwebber \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +17,105 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "" + #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" msgstr "" @@ -90,10 +189,6 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 -msgid "Resent your verification email." -msgstr "" - #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format msgid "" diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 8899a3ea..ffcd17df 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/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-08-08 10:20-0500\n" -"PO-Revision-Date: 2011-08-09 00:35+0000\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-09 14:10+0000\n" "Last-Translator: joar \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,107 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Användarnamn" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Lösenord" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "Lösenorden måste vara identiska." + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "Bekräfta lösenord" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "E-postadress" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "Vi beklagar, registreringen är avtängd på den här instansen." + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "En användare med det användarnamnet finns redan." + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och " +"ladda upp filer!" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "Verifieringsnyckeln eller användar-IDt är fel." + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Skickade ett nytt verifierings-email." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "Titel" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "Sökvägsnamn" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "Sökvägsnamnet kan inte vara tomt" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "Taggar" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Presentation" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Hemsida" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "Ogiltig URL" + +#: mediagoblin/edit/views.py:54 +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:75 +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:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "Var försiktig, du redigerar en annan användares profil." + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "Fil" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "Du måste ange en fil" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "Filen verkar inte vara en giltig bildfil!" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "Tjohoo! Upladdat!" + #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" msgstr "GNU MediaGoblin" @@ -94,10 +195,6 @@ msgstr "Skapa ett!" msgid "Create an account!" msgstr "Skapa ett konto!" -#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 -msgid "Resent your verification email." -msgstr "Skickade ett nytt verifierings-email." - #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format msgid "" From b811346a2abfb6b0359b12cb68047f8fd98bf204 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 9 Aug 2011 09:48:06 -0500 Subject: [PATCH 039/134] Compiling the translations files again --- .../i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 3688 -> 5330 bytes .../i18n/sr/LC_MESSAGES/mediagoblin.mo | Bin 3752 -> 5401 bytes .../i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 3767 -> 5467 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index c403e3cc1e98f59c087bc732986a57d6b25cac1b..eaa79dfa4c8bed2a279beb08a59c418b57dc7ed6 100644 GIT binary patch literal 5330 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 CN`2J; delta 786 zcmYMwO-NKx6u|NG(l;NCO*W%7S>}_P7X{VSFj#^`pJQP|QMQ{zr-26ML(BrhVOmH* zt>P36Ni7Q6*g_bnjX_au+C(cCqC(&*TGb*9s{f@2J?^`|d+z%<_nd{@uR3c>k>-cO z<#KQ39CXomZU@Hz`2aaM3-os5;$89)^>qTnv ziA9x-Wt_llvq%Q#@ff=5QQ%vjdE}F!3G>K>MD$e0%jPp?!9zk=EA-se| z>>$6qW5JLmrZBFcdGQCDA6ou@2Z*3U?BW(oV-Ry_4p72Hx_1lPh%fVSFJ8lg_!LdY z7SQB#*Ybbz%N`aCIm~1#J&m+RvS=zOp=sG2Z~r;oCVq*pu`eXjkH4@7PjLE9oWuY= z@_dFd;upxP@&Rk6!p|(q_yrw2PhaCWhICQtcoCoA4*ZU$f*9?h80qrd<(Wj&kv=r7 zKZg#Ede85p>ELu&^lQ^c-|^vcE?-oiJ=J(@Pg|PtU(h%HS-l>}>YqTno(d-QXRs$$ z%vDNxXT0L1GlS0A{FTCRx-wEMlr4&|FgSE5OE+PXE>?*0YmF>B)h From ff0e4fd52b680a13ac75756ec3f8a883bed9f535 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 9 Aug 2011 10:12:05 -0500 Subject: [PATCH 040/134] Joar updating a typo in the Swedish translations :) --- .../i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 5467 -> 5461 bytes .../i18n/sv/LC_MESSAGES/mediagoblin.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo index f13bfb9e3e1679a162a01a2dba0ed37fd8cba734..04fe0b6ffde34b7eabe97b8ea9784f123e96795b 100644 GIT binary patch delta 299 zcmXZWF-rn*7{~F4j_VR^IIX1+OFFs}c4(-f(W`HWcLkBxp!EsTh;xW9lP!B&*JzO9+;TN^^IA@EMl8q2vsm)<~2qY&IH zkY0g<+z_s zxWFs?!9#SiB1c%>+t}MhmG{uYJ{IsPD-)?Oys=OZm#7{l$W2*e9ygf6)06+A7Sd5V z*u*~8aEdux;0-3I3e{PjVOxc^`#AQa;CASHV<-OA+_ZMtx`^%L7u^^|;k`e2u\n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -144,8 +144,8 @@ msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" -"Drivs av MediaGoblin, ett project " -"från GNU" +"Drivs av MediaGoblin, ett GNU-projekt" #: mediagoblin/templates/mediagoblin/root.html:21 msgid "Welcome to GNU MediaGoblin!" From 1c266dc328cd6fb1e0275d104a6e8fbceeb187fc Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 10:48:02 -0500 Subject: [PATCH 041/134] Utilities to lazily translate strings and also fake a translation for extraction --- mediagoblin/util.py | 48 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/mediagoblin/util.py b/mediagoblin/util.py index ed7be841..b46c65d9 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -28,11 +28,13 @@ import copy import wtforms from babel.localedata import exists +from babel.support import LazyProxy import jinja2 import translitcodec from webob import Response, exc from lxml.html.clean import Cleaner import markdown +from wtforms.form import Form from mediagoblin import mg_globals from mediagoblin import messages @@ -94,7 +96,7 @@ def get_jinja_env(template_loader, locale): template_env.install_gettext_callables( mg_globals.translations.ugettext, - mg_globals.translations.ngettext) + mg_globals.translations.ungettext) # All templates will know how to ... # ... fetch all waiting messages and remove them from the queue @@ -494,6 +496,50 @@ def pass_to_ugettext(*args, **kwargs): *args, **kwargs) +def lazy_pass_to_ugettext(*args, **kwargs): + """ + Lazily pass to ugettext. + + This is useful if you have to define a translation on a module + level but you need it to not translate until the time that it's + used as a string. + """ + return LazyProxy(pass_to_ugettext, *args, **kwargs) + + +def pass_to_ngettext(*args, **kwargs): + """ + Pass a translation on to the appropriate ngettext method. + + The reason we can't have a global ngettext method is because + mg_globals gets swapped out by the application per-request. + """ + return mg_globals.translations.ngettext( + *args, **kwargs) + + +def lazy_pass_to_ngettext(*args, **kwargs): + """ + Lazily pass to ngettext. + + This is useful if you have to define a translation on a module + level but you need it to not translate until the time that it's + used as a string. + """ + return LazyProxy(pass_to_ngettext, *args, **kwargs) + + +def fake_ugettext_passthrough(string): + """ + Fake a ugettext call for extraction's sake ;) + + In wtforms there's a separate way to define a method to translate + things... so we just need to mark up the text so that it can be + extracted, not so that it's actually run through gettext. + """ + return string + + PAGINATION_DEFAULT_PER_PAGE = 30 class Pagination(object): From db3e0583494f201c663c7d037410011da951666b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 10:50:42 -0500 Subject: [PATCH 042/134] Make it so that form fields and descriptions are actually translated --- mediagoblin/templates/mediagoblin/utils/wtforms.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index 1d2f8619..e3d8e137 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -19,9 +19,9 @@ {# Generically render a field #} {% macro render_field_div(field) %}
-
{{ field.label }}
+
{{ _(field.label.text) }}
{% if field.description -%} -
{{ field.description }}
+
{{ _(field.description) }}
{%- endif %}
{{ field }}
{%- if field.errors -%} @@ -38,9 +38,9 @@ # ... mostly the same thing except it includes rows and cols #} {% macro render_textarea_div(field, rows=8, cols=20) %}
-
{{ field.label }}
+
{{ _(field.label.text) }}
{% if field.description -%} -
{{ field.description }}
+
{{ _(field.description) }}
{%- endif %}
{{ field(rows=rows, cols=cols) }}
{%- if field.errors -%} @@ -64,7 +64,7 @@ {% macro render_table(form) -%} {% for field in form %} - {{field.label}} + {{ _(field.label.text) }} {{field}} {% if field.errors %} From 7960ac985f9b5a80063f21012d53793cb2d22dd9 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 12:07:59 -0500 Subject: [PATCH 043/134] Converting all forms to use the "fake/null" gettext conversion function Gettext doesn't actually get run right in the form but we do need to wrap the strings in _() so stuff extracts :) --- mediagoblin/auth/forms.py | 2 +- mediagoblin/edit/forms.py | 2 +- mediagoblin/submit/forms.py | 2 +- mediagoblin/user_pages/forms.py | 9 ++++++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index 1b6bc7c2..917909c5 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -16,7 +16,7 @@ import wtforms -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.util import fake_ugettext_passthrough as _ class RegistrationForm(wtforms.Form): diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 8052f482..2f3ed203 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -18,7 +18,7 @@ import wtforms from mediagoblin.util import tag_length_validator, TOO_LONG_TAG_WARNING -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.util import fake_ugettext_passthrough as _ class EditForm(wtforms.Form): diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index ccb62a03..241d32dc 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -18,7 +18,7 @@ import wtforms from mediagoblin.util import tag_length_validator -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.util import fake_ugettext_passthrough as _ class SubmitStartForm(wtforms.Form): diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py index 8829b674..0489f76a 100644 --- a/mediagoblin/user_pages/forms.py +++ b/mediagoblin/user_pages/forms.py @@ -16,7 +16,10 @@ import wtforms +from mediagoblin.util import pass_to_ugettext as _ + + class MediaCommentForm(wtforms.Form): - comment_content = wtforms.TextAreaField( - 'Comment', - [wtforms.validators.Required()]) + comment_content = wtforms.TextAreaField( + _('Comment'), + [wtforms.validators.Required()]) From ad4aef3a67301cf941944981f50dc8734efb9b91 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 12:08:14 -0500 Subject: [PATCH 044/134] Removing a tab. This is a tab-free zone! --- mediagoblin/user_pages/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 85a84db6..fb72a421 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -154,7 +154,7 @@ def atom_feed(request): 'username': request.matchdict['user'], 'status': 'active'}) if not user: - return exc.HTTPNotFound() + return exc.HTTPNotFound() cursor = request.db.MediaEntry.find({ 'uploader': user['_id'], From 369fd2f97214168eae0f8408c4006741b4de8d0a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 12:28:42 -0500 Subject: [PATCH 045/134] Ooops! We should do a fake ugettext passthrough here also. --- mediagoblin/user_pages/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py index 0489f76a..ce7bfaa4 100644 --- a/mediagoblin/user_pages/forms.py +++ b/mediagoblin/user_pages/forms.py @@ -16,7 +16,7 @@ import wtforms -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.util import fake_ugettext_passthrough as _ class MediaCommentForm(wtforms.Form): From 9bc564ff53a7488ee3b6548dea73d5b43d234cda Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 12:44:58 -0500 Subject: [PATCH 046/134] Minor change to indentation --- mediagoblin/user_pages/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py index ce7bfaa4..25001019 100644 --- a/mediagoblin/user_pages/forms.py +++ b/mediagoblin/user_pages/forms.py @@ -21,5 +21,5 @@ from mediagoblin.util import fake_ugettext_passthrough as _ class MediaCommentForm(wtforms.Form): comment_content = wtforms.TextAreaField( - _('Comment'), - [wtforms.validators.Required()]) + _('Comment'), + [wtforms.validators.Required()]) From 84abd2bbc43e2d92d429c679f49e237207057150 Mon Sep 17 00:00:00 2001 From: Caleb Forbes Davis V Date: Wed, 10 Aug 2011 12:48:23 -0500 Subject: [PATCH 047/134] Bug #372 - MediaEntry.thumbnail_file not used - deleted the thumbnail_file from the media_entries collection - added a migration to remove the field from previous db versions --- mediagoblin/db/migrations.py | 10 ++++++++++ mediagoblin/db/models.py | 7 +------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 6a8ebcf9..8c088145 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -52,3 +52,13 @@ def mediaentry_mediafiles_main_to_original(database): 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) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 4ef2d928..aff2a65b 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -169,8 +169,6 @@ class MediaEntry(Document): - 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.) - - - thumbnail_file: Deprecated... we should remove this ;) """ __collection__ = 'media_entries' @@ -196,10 +194,7 @@ class MediaEntry(Document): # The following should be lists of lists, in appropriate file # record form - 'attachment_files': list, - - # This one should just be a single file record - 'thumbnail_file': [unicode]} + 'attachment_files': list} required_fields = [ 'uploader', 'created', 'media_type', 'slug'] From 5d2b00be871c09022446d863150bb77fe7b6e4b2 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 13:07:09 -0500 Subject: [PATCH 048/134] Updating translations --- .../i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 5330 -> 5453 bytes .../i18n/de/LC_MESSAGES/mediagoblin.po | 51 +-- .../i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5331 bytes .../i18n/es/LC_MESSAGES/mediagoblin.po | 299 ++++++++++++++++++ .../i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5337 bytes .../i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 294 +++++++++++++++++ 6 files changed, 620 insertions(+), 24 deletions(-) create mode 100644 mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index eaa79dfa4c8bed2a279beb08a59c418b57dc7ed6..d5024687f631db02c1be382230123cf93e96fc0b 100644 GIT binary patch delta 1067 zcmZ|MPe>F|90%~?|)GdOb@6)a9-!RPQ{pQc__j|v2m44CwsJg1K z93k>I6Ky4;(FUUZa1tJZci|vhti(H`L>myFfwgc9Zh;qJGt9##cpdJ5w_yyp$8N2A&kQXxCt&*`~bHjUV)~e8dS%U zlF+=DhOO`b%)xW9!rBKds&{;#p`Wu?+DEeS)T7 z6}mIVp~=$<+h7`QgQua%=T2f_CU6VZ!#fZsJ-~&*$Ix{C4w?o(Le!ud%>4*V!eej* zCgBaJ;0!d4C9#`!xCfSo8wNL)4%e+jj&~pJ={mTt3rF3M73$2WvSjF4I#4}~dn%9) z>-D)KEH|({Av*)*_Jx*jTNy3g()s!?k(PejR(w3iC5>2NI29<(rUZAm$^{;mMK{{l zF`|MA;W3+A%H~4j)waE>SubdzJ)RENJt{trrsA1lOL&=nNAWP^bi&eHl)gn5BJKUs z=bnQEe=PFSWfMH-xjY=td6tX9Z<|uxLxCIoY-?>%o>Q7D=9lM@TC(!I%@r3i)WY}i zRZDCpQNAY8K2qX&c$o`qPRZiS*z4XO0SySLmF2QrV9J?>hA}0)|Nk4srDk2rJ<4*K z*VDz%wS5s@ycvI5IGIzN4g9ucHkDTn$5cXHzORL=JK0&m*<^W6O4AftVwbp{*37C5 qq=O+1`)klFk3X0d7@7LjT8i+4eawqHloe^M*HuDxQ|TW)rRY1zngAC7 delta 597 zcmXZYODIH99LMqhFyk>8?`Pp!OpHfJni`aBlq3sAHfkPMvzUkOok>EoR+G&{_KFqB zV5JnR36ZiPalXX{^9Gtin*PUd1Nr6qe#X*5e7b;0@AJ-W`$@D~lgC%JCQ1(Lu3- zDV)LrZW+T_ti>Iy#zRy=F42ZrRE_UY1$st?d@>cGrSkv09YfSwWm2S(#ReO#xQil*&ZlVgfjr5Q+bYm8W&{8APfFrnoUM$8_RPSG)I6D%iZbW?%-DS3$+L94l zJhrwKx%&n@gYK?A9{Z%vjQ7kKzNi`Y#bbs?3oPq?ziw#5xy5KOVa8Vi;aDP=St$Ls RWIn9pw)9)|Mf%IW_6IX5Q>Fj_ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 065a28b8..14ef5b83 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -2,14 +2,15 @@ # Copyright (C) 2011 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # +# , 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-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-09 03:57+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2011-08-09 19:03+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" @@ -20,23 +21,23 @@ msgstr "" #: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 msgid "Username" -msgstr "" +msgstr "Benutzername" #: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 msgid "Password" -msgstr "" +msgstr "Passwort" #: mediagoblin/auth/forms.py:34 msgid "Passwords must match." -msgstr "" +msgstr "Passwörter müssen übereinstimmen." #: mediagoblin/auth/forms.py:36 msgid "Confirm password" -msgstr "" +msgstr "Passwort wiederholen" #: mediagoblin/auth/forms.py:39 msgid "Email address" -msgstr "" +msgstr "E-Mail-Adresse" #: mediagoblin/auth/views.py:40 msgid "Sorry, registration is disabled on this instance." @@ -51,6 +52,8 @@ msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" +"Ihre E-Mail-Adresse wurde bestätigt. Sie können sich jetzt anmelden, Ihr " +"Profil bearbeiten und Bilder hochladen!" #: mediagoblin/auth/views.py:158 msgid "The verification key or user id is incorrect" @@ -63,7 +66,7 @@ msgstr "" #: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 msgid "Title" -msgstr "" +msgstr "Titel" #: mediagoblin/edit/forms.py:29 msgid "Slug" @@ -83,7 +86,7 @@ msgstr "" #: mediagoblin/edit/forms.py:41 msgid "Website" -msgstr "" +msgstr "Webseite" #: mediagoblin/edit/forms.py:43 msgid "Improperly formed URL" @@ -103,7 +106,7 @@ msgstr "" #: mediagoblin/submit/forms.py:29 msgid "File" -msgstr "" +msgstr "Datei" #: mediagoblin/submit/views.py:45 msgid "You must provide a file." @@ -119,23 +122,23 @@ msgstr "" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" -msgstr "" +msgstr "GNU MediaGoblin" #: mediagoblin/templates/mediagoblin/base.html:45 msgid "Mediagoblin logo" -msgstr "" +msgstr "Mediagoblin Logo" #: mediagoblin/templates/mediagoblin/base.html:51 msgid "Submit media" -msgstr "" +msgstr "Medien hochladen" #: mediagoblin/templates/mediagoblin/base.html:62 msgid "verify your email!" -msgstr "" +msgstr "Bitte bestätigen Sie Ihre E-Mail-Adresse!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "Login" -msgstr "" +msgstr "Anmelden" #: mediagoblin/templates/mediagoblin/base.html:88 msgid "" @@ -149,7 +152,7 @@ msgstr "Willkommen bei GNU MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:26 msgid "Submit an item" -msgstr "" +msgstr "Eintrag hochladen" #: mediagoblin/templates/mediagoblin/root.html:31 #, python-format @@ -165,18 +168,18 @@ msgstr "" #: mediagoblin/templates/mediagoblin/auth/login.html:26 msgid "Log in" -msgstr "" +msgstr "Anmelden" #: mediagoblin/templates/mediagoblin/auth/login.html:29 msgid "Login failed!" -msgstr "" +msgstr "Anmeldung fehlgeschlagen!" #: mediagoblin/templates/mediagoblin/auth/login.html:34 #: mediagoblin/templates/mediagoblin/auth/register.html:30 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 #: mediagoblin/templates/mediagoblin/submit/start.html:32 msgid "Submit" -msgstr "" +msgstr "Speichern" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Don't have an account yet?" @@ -204,15 +207,15 @@ msgstr "" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "" +msgstr "%(media_title)s bearbeiten" #: mediagoblin/templates/mediagoblin/edit/edit.html:36 msgid "Cancel" -msgstr "" +msgstr "Abbrechen" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 msgid "Save changes" -msgstr "" +msgstr "Änderungen speichern" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format @@ -231,7 +234,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" -msgstr "" +msgstr "Medien hochladen" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -285,7 +288,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:84 msgid "Edit profile" -msgstr "" +msgstr "Profil bearbeiten" #: mediagoblin/templates/mediagoblin/user_pages/user.html:95 #, python-format diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..043265a330a162bc23df295f3220a69d93155b07 GIT binary patch literal 5331 zcmeI0O^h5z6@V*XNEl3F;s8mApvGb4HQt$>wQ*v`-UY9-Hjcbz@$T9RNSK=LnwheD zy2f4IyB-NRapJ-O@e=_8q#(h;Na5!M5)vjSBqYQIE{KyQ1So(|lna9Ibs66epub8ruvEW%4rP8h!_=iOC|^EHwjrAnXr%nE9?ttU7LVKeOH0ebwie ziYz%0_RVddeSF%?v0`9jXVi&g;6tuspW3>9#uu43QRIs>*CBUFqEl<*pmVP~RO`vTz_>(*zAutkn=Er{R=ZRi-L>m_;0HF%gI;%epQj~-*!s5H+;)!e*q*f}YB+9a7Z@krZiE+DDvGoANc&|-B{%{#A7nl!SBI_cA{%LaOA zLRj}%tWL5px7wggWlDYH5k~61&1_vg<Yqg2VDsGXH2viB7&U9r9 z;%1S9%ZD}#gr-yE@_avTNhB>waod+yVV^1&M|f^qx+T8n#^U$QF+d&3H2fQD++cyr zn;ScmaJL6wN)Hojg4NsQX0}HL*lZ(}&yU9}^2Xwqg-h2{zt!ms4Qlx++7fbJOdwUedl@J?fRw#+yB_mNqhU;|~sD zftLp+kNQou-Bc?cao1qx5>7|9to!&Pm zd4!3VZIsJob-s$m?QyL>xntOyYFQ3U)Hi9*2DQvFRm+_8@>rQbl&eT#!?r_J)_~2U zD+Oz+%rhKYm6$$DcNUmspJgMlN>0eO(jd!slm@h_CZ`mXBI;L5y3{ZV)%c@Iv#dM; znj#XrU^>K2%2BDB)F>$@tSCAImyaQKxZDmlhGiT!1|u}99;}#NP%CmCNrsJd(ZSlm z*f0?@Fg*&7%qr^}r-uVTRked*J}RHz5|Ar)q^WtO{f?s($h-(c38Gq&Dx_A&^vDCz%YtoVb-_`F4F%kHZ>ckzh5w@M1WZ#GZ4wbfQFKSWsjG|L_r0&{$|t$x`7`6H zK_x2-V-=yT3#h4=G9PhiR6&bOAyub&`?}Oqz$*JTboys&%Y#A^ueq26C>>o2&Bhne zxYknA15TwpR?g(Il3R@adyG zd>U0mV%UD#r(Fnz4Yj2Yt~APfjeQzVaYMBAq1Mbyqji**K6I#kPq}5_#Dpxz`Ht7eE53hRKjxU4_6m}>v0}}j zt(S);b)l~(Pa?u4&ZGzQt_Kt7qBOm%%$&m5>No>^Sj^7Tx!RpaW<=`$KDqahB-?KPa37?&QC8kGf` z&lY*Nadc~*sMfVvV}YX-b8WWu(T>Y&r)_E}4wfK|+Irq}Y@%Du_couX{m-;ntEthr zDl@Us5mnCyIYhWgkN7}(EK3KK@wfa{gu-Nw?rf{iGTE!{v~-|^Iszdp}-T(haeiDqZ_vDLmUq-&DRb=BnGD)l`^2|7<24iY?~RUmB&zAjhZ TxQl%iofH3~aJ9HolB>T1MPD@2 literal 0 HcmV?d00001 diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..d2744d86 --- /dev/null +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,299 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-10 03:38+0000\n" +"Last-Translator: nvjacobo \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" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Nombre de Usuario" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Contraseña" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Reenvíe su correo electrónico de verificación" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Bio" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Sitio web" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "URL de forma incorrecta" + +#: mediagoblin/edit/views.py:54 +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:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "." + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "." + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "Archivo" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "Usted debe proporcionar un archivo." + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "El archivo no parece ser una imagen!" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "Woohoo! Enviado!" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "Verifique su correo electrónico" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Potenciado por MediaGoblin, a GNU project" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "¡Bienvenido a GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" +"Si tiene una cuenta, puede iniciar sesión Login." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "El inicio de sesión fallo" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Crea una aquí" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +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 +msgid "Cancel" +msgstr "Cancelar" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Salvar cambios" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "Lo sentimos, no se ha encontrado el usuario." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + + diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..ce967d59fec8ad8a2c8fa7d1c881116ea36eaf4b GIT binary patch literal 5337 zcmeH}O>87b6~_xOBpDXS2LTcglr62+)_TU{1+&ZS+F-A}iz9n6{@B&Bf~97rB#@9m3d#)*2*e=*1QOzc1OyZzp(qj;ey@AR_Imla zaq?(9KUa6v>-XOO)vNyf!xLXsd=~k84}TM{m(k(puWwN59Sr{l=itPIQVZ|{@Co?j zX#4}n6!kKE6MO|e2w#N{!~5P?jvt4QGd>GX!7K2ca0k8@J_X+bzXVyTz6Re0pMjr) z&%+@+%R{cg@4yxK5BMlNf1gs1z)dKA7|0UUg<>~_;?HNH`1fUaKYSL-`sZL5z6c+K z)7*R?T!G?m6N+CBUWWnB!koqtJA9h8J`|mwg-^g=jmDD%BRb!JlHXfU;%P#8z8{Uh2qhm+Ly7zQP~v+L ziq5}=m{hMq$-@L9i_Q=5BRW3@MdzpCHTVz@5uHB`MW=5;$;XeN`0;Zn`FaV8-QPm- z=TDHY`X@h<$5RiL>mP+(#%H1E{1qrVe;10szkuS`@1W@X2PnFn$Ed^=!Fl)vD9`^M zBoy^SDC>U;<+(3GvGYeLI{yVq9v;Mbu{RCH?>#8~-GY2o#E*t|py>Q{C^~-=VnY2G ziq5};qVxT4FLhppqVp%A===hd`9Fc`^mOiRmYSZO@n^j5XRaM5R$Vf>o7wi_RC)h) zo+UGWYU$|gOLJz46+IipMlB~j=Yx)1YA5wgmuK3vS}sq6_90FZomv}t9h`1jy>GL) z9owj;mQ!teCQh{Px;%-r$+CFg>NwR#x9vdpT+gP#>p>j4T=gN#TOoF-*DlpvHxPr7 z)83V)(vS_yxuI)#a*}tnNiu7qp|*EokEOQDbm+!jOVl;B5<7L-q%E7M%PwulSx@(k z_XC$j>M{$1)dpwEP$tKh2vT=#W+&CEOV0$|H8_1ZPY-SQuv&}aaF9+J#A!#Lo-WdL zJH#O&;l-r#`oC3Stw@fEqRe`)u81&KukGngN%>XROyX31G{)%R;@L`toEWmSFU}7| ziDOH~;mm5+w<+1MWF<-5KpffI-XPJHV%@+tbu)7VGS#S5PEVJ*wTviG7KB=F%OlXu zVuzIXZRU}tnFqOkhO{J77KOQ^%S+j3i^VN6cck1B*NI2wrNdN;Mw67=>Lots*cIwHg; zZ7axRwOy)ludd~t|0sJ+?Z}2{bxqo_UhS|=)ebwo*jC1)a;X$C9NAPw4>;Jm(y(TW zIwP@Vi|MlTc!Sw-SvHiYWQQDS4YK@LYrv~=a!NzVTitR=n;u4^8r>>A%ZeSKX(CbV zO%vUu9Tl!gkCJx6ioDs2!w3>b9BgkqEOZzThIm$9*fkxmc4a?O4C8Xq-rC+MFfr3J z9U70!D*79{hYdhiwY`2A7T50*Yen62ZfycU5XqS}=%r1nPrUtKTya=E{Y zhHWEtJ*EvC8n|oU)n^VG{|(#pgr;uTq=km!=&^n?sctyeb#79ZISEqdH%DEAPF6I= zQlY~GsHV3v*W%D9MQfQ{x=!uhb*ZC)mGO;z`fqECjY1Lc#}NfkB)Tw~jSiwwucf7X zl1h6llgVKvry5&qs8h}z_F^ z*Yg(|^@X!_K9vpQLv=SZsZR(qYv?O`8youC^5&Ypw6?jtzVVUe)z$5_ot-77rk$MP zt?pXWYv?UP$~!n^_4G<+J`*RgNoVx*D6GL?Pzz!=ZreL|$JM_pvVgU@ez?7|JvUR? zO7hGk)hqO0-_U8l82ZI?7da8+&f;{cm-PHhWpjOV?J(i\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" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +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 +msgid "Cancel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +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:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + + From 6d794f268bb1f5d3cc56c5f0dc902571d48ebeac Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 18:31:29 -0500 Subject: [PATCH 049/134] Updating translations --- .../i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 5453 -> 5641 bytes .../i18n/de/LC_MESSAGES/mediagoblin.po | 91 +++-- .../i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 5331 -> 5708 bytes .../i18n/es/LC_MESSAGES/mediagoblin.po | 79 +++-- .../i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5406 bytes .../i18n/fr/LC_MESSAGES/mediagoblin.po | 305 +++++++++++++++++ .../i18n/nn_NO/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5217 bytes .../i18n/nn_NO/LC_MESSAGES/mediagoblin.po | 308 +++++++++++++++++ .../i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 5337 -> 5414 bytes .../i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 108 +++--- .../i18n/ro/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5629 bytes .../i18n/ro/LC_MESSAGES/mediagoblin.po | 314 ++++++++++++++++++ .../i18n/sl/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5487 bytes .../i18n/sl/LC_MESSAGES/mediagoblin.po | 309 +++++++++++++++++ 14 files changed, 1399 insertions(+), 115 deletions(-) create mode 100644 mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index d5024687f631db02c1be382230123cf93e96fc0b..6bb69ce9bd9b38a4afc601b10d53fa76ef313738 100644 GIT binary patch delta 2265 zcmZ{l-)~e!6vsyh0_FD)qbT6nq(!LRQYng7B(xN&&^G>n5EG-!?#{hC?7efz%-lBi zWqt6)@Sw>)5lKu8Z-&H3LZabqO-xMGHxk2>`s9=N2N?aHxp#MqV$<%Yvv=mqIp6c+ z{xJH{*q58vv>z8joZlkE5ikK?20sHA!F%8+IJ#AcA@BmY5xfNM1}}qqz&5x8yaql2 zeo?N!1)s$FE?5Eo1YuI_+9t$0u(D0G1^yS$;NxTP7> z*$Mm%%}eL2=dCm@kv_9ibXJ;EGnuV7rEPdR{=o8NC(xoK|!?l{&$JR+gs9j1exvpCu>xuv~DwGZ;-}y{SyN$&ZU!tsGY8 za=YTSR|z%QIqa<|tF(8tq-?BeeD#dZVk@sSwd!2hN~ac8u3YK1Rk3#7YMe0@@#bI! zAL`ADc(pVd9BB2!?R>TM@bJjN+$n2hst&nTs!>ha8a#krr_;{bZAaUAN{#+e_@`-Z z@dB}?axSYS&~POu+46cR_%T+5$gxCO5-ZbCG~KYuIYrpZs-<*M)oM0dh6B{S9Ysc& zsiC2fg9utjx-PxW%zL>_4mojgQ5h2?g|x08d90e<+tyQV8bR}!UdnP4yO5J*6%)i6 zqn0$L(3VB%T;0BBTAEZP$m{XL@#TEk`{X_@C23ob z+*7Lkln4olLqe*Z;T@Bk=DRn#ccSpLBX>-$3(9x?TED+tMT1;cEzb^%)yfr>x*(HM zg$EwGYEkT=m7DHkcI}*LO6+@AY{I1(*J4Dd8Oe5#k%HsZ?BCwXhSo~1mmm}HQMEUD1Ee7=tMi% zvYeyi3GL423fW^7q0V^opv4d_mlw%ADgvNN%Wy{|I*s&jwm(e^@- zyr5d)1IF|9KiAC+TyO5?zT>CnfeMnthu#j5?YWgcql6SBX)}&+t=>o?Aw|d4+>$2 z4h3D}d8r5@i;f9OmktJ2w+`JZx)c;dm%0RX>ia^6$9#Uj;mz;&d+%2N+rFii*!)%@ z#KdMH_Te-R;e9-g@7D93twJ=CpT#6jVmp>_3(jB)Z{iNTi)mb0&);Ad`DbJa(I!OP z(kA9@EF50fuoq`>5l>+!Rg37OgU>L7uQ7oi*8PIp$$y|7C{A}mkwv>NhdsC-t9Tym z{+H=_A-V}Z^1(Lvi<>Y-l}U84AAS6PG8`aZL3fxPDc{q3>p^8SbZb*? zKGK!t3oWq*^QZB*DYbT+ruY%_sx@z><1&^%X`HqL%d7E64W=VqFxQ(pOf@}dR+|=` zwHvyuf*D;=T83AYcd@DhZFJ&&Y9kS2o{j>yV(w%*&4WzJ%qGL6@WVcyzazmW2CNC*f h7DX?Ll$=swwDvgi>`1oAMpf7I^GC~p3PZI^`~x9tmi7Pu diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 14ef5b83..30c55e21 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -2,15 +2,17 @@ # Copyright (C) 2011 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # +# Rafael Maguiña , 2011. # , 2011. # , 2011. +# Jan-Christoph Borchardt , 2011. msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-09 19:03+0000\n" -"Last-Translator: elrond \n" +"PO-Revision-Date: 2011-08-10 23:20+0000\n" +"Last-Translator: JanCBorchardt \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" @@ -37,32 +39,32 @@ msgstr "Passwort wiederholen" #: mediagoblin/auth/forms.py:39 msgid "Email address" -msgstr "E-Mail-Adresse" +msgstr "Email-Adresse" #: mediagoblin/auth/views.py:40 msgid "Sorry, registration is disabled on this instance." -msgstr "" +msgstr "Registrierung ist auf dieser Instanz leider deaktiviert." #: mediagoblin/auth/views.py:55 msgid "Sorry, a user with that name already exists." -msgstr "" +msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen." #: mediagoblin/auth/views.py:152 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -"Ihre E-Mail-Adresse wurde bestätigt. Sie können sich jetzt anmelden, Ihr " +"Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, dein " "Profil bearbeiten und Bilder hochladen!" #: mediagoblin/auth/views.py:158 msgid "The verification key or user id is incorrect" -msgstr "" +msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch." #: mediagoblin/auth/views.py:179 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 msgid "Resent your verification email." -msgstr "" +msgstr "Bestätigungs-Email noch Mal senden." #: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 msgid "Title" @@ -70,19 +72,19 @@ msgstr "Titel" #: mediagoblin/edit/forms.py:29 msgid "Slug" -msgstr "" +msgstr "Kurztitel" #: mediagoblin/edit/forms.py:30 msgid "The slug can't be empty" -msgstr "" +msgstr "Bitte gib einen Kurztitel ein" #: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 msgid "Tags" -msgstr "" +msgstr "Markierungen" #: mediagoblin/edit/forms.py:38 msgid "Bio" -msgstr "" +msgstr "Biographie" #: mediagoblin/edit/forms.py:41 msgid "Website" @@ -90,19 +92,19 @@ msgstr "Webseite" #: mediagoblin/edit/forms.py:43 msgid "Improperly formed URL" -msgstr "" +msgstr "Adresse fehlerhaft" #: mediagoblin/edit/views.py:54 msgid "An entry with that slug already exists for this user." -msgstr "" +msgstr "Diesen Kurztitel hast du bereits vergeben." #: mediagoblin/edit/views.py:75 msgid "You are editing another user's media. Proceed with caution." -msgstr "" +msgstr "Du bearbeitest die Medien eines Anderen. Bitte sei vorsichtig." #: mediagoblin/edit/views.py:96 msgid "You are editing a user's profile. Proceed with caution." -msgstr "" +msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig." #: mediagoblin/submit/forms.py:29 msgid "File" @@ -110,15 +112,15 @@ msgstr "Datei" #: mediagoblin/submit/views.py:45 msgid "You must provide a file." -msgstr "" +msgstr "Du musst eine Datei angeben." #: mediagoblin/submit/views.py:48 msgid "The file doesn't seem to be an image!" -msgstr "" +msgstr "Diese Datei scheint kein Bild zu sein!" #: mediagoblin/submit/views.py:96 msgid "Woohoo! Submitted!" -msgstr "" +msgstr "Yeeeaaah! Geschafft!" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -126,7 +128,7 @@ msgstr "GNU MediaGoblin" #: mediagoblin/templates/mediagoblin/base.html:45 msgid "Mediagoblin logo" -msgstr "Mediagoblin Logo" +msgstr "Mediagoblin-Logo" #: mediagoblin/templates/mediagoblin/base.html:51 msgid "Submit media" @@ -134,7 +136,7 @@ msgstr "Medien hochladen" #: mediagoblin/templates/mediagoblin/base.html:62 msgid "verify your email!" -msgstr "Bitte bestätigen Sie Ihre E-Mail-Adresse!" +msgstr "Bitte bestätige deine Email-Adresse!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "Login" @@ -145,6 +147,8 @@ msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" +"Läüft mit MediaGoblin, einem GNU-Projekt" #: mediagoblin/templates/mediagoblin/root.html:21 msgid "Welcome to GNU MediaGoblin!" @@ -158,6 +162,8 @@ msgstr "Eintrag hochladen" #, python-format msgid "If you have an account, you can Login." msgstr "" +"Falls du ein Konto hast, kannst du dich anmelden." #: mediagoblin/templates/mediagoblin/root.html:37 #, python-format @@ -165,6 +171,8 @@ msgid "" "If you don't have an account, please Register." msgstr "" +"Wenn du noch kein Konto hast, registriere " +"dich." #: mediagoblin/templates/mediagoblin/auth/login.html:26 msgid "Log in" @@ -179,19 +187,19 @@ msgstr "Anmeldung fehlgeschlagen!" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 #: mediagoblin/templates/mediagoblin/submit/start.html:32 msgid "Submit" -msgstr "Speichern" +msgstr "Bestätigen" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Don't have an account yet?" -msgstr "" +msgstr "Hast du noch kein Konto?" #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Create one here!" -msgstr "" +msgstr "Registriere dich!" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" -msgstr "" +msgstr "Neues Konto registrieren!" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -203,6 +211,11 @@ msgid "" "\n" "%(verification_url)s" msgstr "" +"Hi %(username)s,\n" +"\n" +"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in einem Webbrowser öffnen:\n" +"\n" +"%(verification_url)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format @@ -220,17 +233,17 @@ msgstr "Änderungen speichern" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "" +msgstr "%(username)s’s Profil barbeiten" #: mediagoblin/templates/mediagoblin/listings/tag.html:29 msgid "Media tagged with:" -msgstr "" +msgstr "Medien markiert mit:" #: mediagoblin/templates/mediagoblin/listings/tag.html:40 #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 msgid "atom feed" -msgstr "" +msgstr "Atom-Feed" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -239,40 +252,44 @@ msgstr "Medien hochladen" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "%(username)s’s Medien" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 #: mediagoblin/templates/mediagoblin/user_pages/user.html:30 msgid "Sorry, no such user found." -msgstr "" +msgstr "Dieser Benutzer wurde leider nicht gefunden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:37 #: mediagoblin/templates/mediagoblin/user_pages/user.html:57 msgid "Verification needed" -msgstr "" +msgstr "Überprüfung notwendig" #: mediagoblin/templates/mediagoblin/user_pages/user.html:40 msgid "Almost done! Your account still needs to be verified." -msgstr "" +msgstr "Fast geschafft! Dein Konto muss nur noch bestätigt werden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:45 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." #: mediagoblin/templates/mediagoblin/user_pages/user.html:49 msgid "In case it doesn't:" -msgstr "" +msgstr "Wenn sie nicht ankommt:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:52 msgid "Resend verification email" -msgstr "" +msgstr "Bestätigung noch Mal senden" #: mediagoblin/templates/mediagoblin/user_pages/user.html:60 msgid "" "Someone has registered an account with this username, but it still has to be" " verified." msgstr "" +"Jemand hat schon ein Konto mit diesem Nutzernamen registriert, aber es muss " +"noch bestätigt werden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:66 #, python-format @@ -280,11 +297,13 @@ msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "" +"Wenn dir dieses Konto gehört und die Bestätigungsmail weg ist, kannst du " +"dich anmelden und sie erneut senden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:76 #, python-format msgid "%(username)s's profile" -msgstr "" +msgstr "%(username)s’s Profil" #: mediagoblin/templates/mediagoblin/user_pages/user.html:84 msgid "Edit profile" @@ -293,6 +312,6 @@ msgstr "Profil bearbeiten" #: mediagoblin/templates/mediagoblin/user_pages/user.html:95 #, python-format msgid "View all of %(username)s's media" -msgstr "" +msgstr "Alle Medien von %(username)s anschauen" diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo index 043265a330a162bc23df295f3220a69d93155b07..dfd3a1bcc4775ce5f49a4adbf1ba9c481103fe50 100644 GIT binary patch delta 2081 zcmaKs&ug4T7{|wk#HvlwO=4_HrL$J^12>!a16x8hhPnppHU!%UB2s4Oo$L_USO-r(O~@(m8t4`L3iSKRley$CPVPMzIDL5V<;A5} z7Wbx)R3DpO7j{!B8VUNsY~qB~tS#o;j3eiaj)j(y@$a&ahv!oA0i(jj-J6s%CuvLY zmMPPV3FV2M5v~jd;+Src= zZZuWQQK?;Q6V9d4!qF{e8Er8>Ags!!M%Gfq$C*gaGAFvX7&&JJLnu}xQvPRwZ71Db za{I?MlV|7p{FmHcvy$FhS&{Izl^FZcvjO+!gdSJyTwlrv`3d<1+ zoc&UoJyt1}w-SLHSRr&rGOJ8>e{^b*agJ4cc7eT7^}+Qct|cCtMJAlPP5gUis4J&dd!% zMJy37W=kaK*35NNrfGtUdp4nUc&pDh4z+4PLT;qyGLkl{m9~fSi)X)Dcc z-eP1$1=(RkNYj+K81(M*k`L>9!(Xc1u)@0_aS5~16r#r_Vx8{pe|CwflDa|T=vcOm zLp9JG2yg-sis1XPuc8gFAP13MA6rNd>=LS%AM6)eH4?7H8dAaO$QZW`Sr#ox&z2TDV>+#_;`A!%Lp0_yl zeT*UK?mIEmeSe%C9CbANWBhEoQ8bL7Z|J_5=}_UK!}|(arR&y&eh7uxLg%w29PKda z9u?)^$D25GVX#Lp+8A>6Ch7~9otl_VF<#-!{~s>imd;P=p01d=bfsl5GV)SL-9#rc qTgh)0CQUxMD)cH$;afeQyzTDICZ@P6lTCs7u`&>wc6MvxxxWE@Cv#N* delta 667 zcmXZXPe>GD9LDkAx^BB`+q&bdmL@feuGF^q2g#x!kPcCz2x)mLN8NDK-C<{Ti=bGD zE}ef+L`4uCx)|9;myRZMkRUvD>*OH_szaS5zb^^zyr1_Sc%S!qH}acD-z1vq9U?Nd zPh@B}`=i}(dcusbOd#!DE(E11GrY{LpNP`HfMOR;lw5 z%5)bG;B9<}6PV(balD2mXa#Lt$36HJBlr!?#an0!g{=Pt)3}#?7Ta+Mm+?Gy;ybG@ zGRWdHKPV;tuo;u2Tt*x7cw^T`IK=)VngV~&oZCk8;sovJAf0G(a@dOlXdWn?0*KsSgwH3`p%F$7OezADdYdnq2g!EbJx{gOPnzs(> zooKIf&MQ}aHz=&Fx-#ho!7a~U2%J(as5&LLI=`qdtcvDhT{_x!R=wB*?Y57r9beK7 tJF73_W7dRMn)3_JLcy61YOY`O^lyAb->1(s^^4wX@6%r`MLpJ$*#Ul;X@LL$ diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index d2744d86..0a12586c 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-10 03:38+0000\n" +"PO-Revision-Date: 2011-08-10 20:30+0000\n" "Last-Translator: nvjacobo \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" @@ -28,33 +28,36 @@ msgstr "Contraseña" #: mediagoblin/auth/forms.py:34 msgid "Passwords must match." -msgstr "" +msgstr "Las contraseñas deben coincidir." #: mediagoblin/auth/forms.py:36 msgid "Confirm password" -msgstr "" +msgstr "Confirme su contraseña" #: mediagoblin/auth/forms.py:39 msgid "Email address" -msgstr "" +msgstr "Dirección de correo electrónico" #: mediagoblin/auth/views.py:40 msgid "Sorry, registration is disabled on this instance." -msgstr "" +msgstr "Lo sentimos, el registro está deshabilitado en este momento." #: mediagoblin/auth/views.py:55 msgid "Sorry, a user with that name already exists." -msgstr "" +msgstr "Lo sentimos, un usuario con ese nombre ya existe." #: mediagoblin/auth/views.py:152 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" +"Su dirección de correo electrónico ha sido verificada. Ahora puede ingresar," +" editar su perfil, y enviar las imágenes!" #: mediagoblin/auth/views.py:158 msgid "The verification key or user id is incorrect" msgstr "" +"La clave de la verificación o la identificación del usuario es incorrecta" #: mediagoblin/auth/views.py:179 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 @@ -63,19 +66,19 @@ msgstr "Reenvíe su correo electrónico de verificación" #: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 msgid "Title" -msgstr "" +msgstr "Título" #: mediagoblin/edit/forms.py:29 msgid "Slug" -msgstr "" +msgstr "Ficha" #: mediagoblin/edit/forms.py:30 msgid "The slug can't be empty" -msgstr "" +msgstr "La ficha no puede estar vacia" #: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 msgid "Tags" -msgstr "" +msgstr "Etiquetas" #: mediagoblin/edit/forms.py:38 msgid "Bio" @@ -95,11 +98,12 @@ msgstr "Una entrada con esa ficha ya existe para este usuario." #: mediagoblin/edit/views.py:75 msgid "You are editing another user's media. Proceed with caution." -msgstr "." +msgstr "" +"Usted está editando el contenido de otro usuario. Proceder con precaución." #: mediagoblin/edit/views.py:96 msgid "You are editing a user's profile. Proceed with caution." -msgstr "." +msgstr "Usted está editando un perfil de usuario. Proceder con precaucións." #: mediagoblin/submit/forms.py:29 msgid "File" @@ -123,11 +127,11 @@ msgstr "GNU MediaGoblin" #: mediagoblin/templates/mediagoblin/base.html:45 msgid "Mediagoblin logo" -msgstr "" +msgstr "Mediagoblin logo" #: mediagoblin/templates/mediagoblin/base.html:51 msgid "Submit media" -msgstr "" +msgstr "Enviar contenido" #: mediagoblin/templates/mediagoblin/base.html:62 msgid "verify your email!" @@ -135,7 +139,7 @@ msgstr "Verifique su correo electrónico" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "Login" -msgstr "" +msgstr "Conectarse" #: mediagoblin/templates/mediagoblin/base.html:88 msgid "" @@ -151,7 +155,7 @@ msgstr "¡Bienvenido a GNU MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:26 msgid "Submit an item" -msgstr "" +msgstr "Enviar un item" #: mediagoblin/templates/mediagoblin/root.html:31 #, python-format @@ -166,10 +170,12 @@ msgid "" "If you don't have an account, please Register." msgstr "" +"Si no tienes una cuenta, por favor, Regístrese ." #: mediagoblin/templates/mediagoblin/auth/login.html:26 msgid "Log in" -msgstr "" +msgstr "Conectarse" #: mediagoblin/templates/mediagoblin/auth/login.html:29 msgid "Login failed!" @@ -180,11 +186,11 @@ msgstr "El inicio de sesión fallo" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 #: mediagoblin/templates/mediagoblin/submit/start.html:32 msgid "Submit" -msgstr "" +msgstr "Enviar" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Don't have an account yet?" -msgstr "" +msgstr "¿No tienes una cuenta?" #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Create one here!" @@ -192,7 +198,7 @@ msgstr "Crea una aquí" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" -msgstr "" +msgstr "Crea una cuenta!" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -204,11 +210,13 @@ msgid "" "\n" "%(verification_url)s" msgstr "" +"Hola %(username)s , para activar su cuenta MediaGoblin GNU, abra ls " +"siguiente URL en su navegador: %(verification_url)s " #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "" +msgstr "Edición %(media_title)s " #: mediagoblin/templates/mediagoblin/edit/edit.html:36 msgid "Cancel" @@ -221,26 +229,26 @@ msgstr "Salvar cambios" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "" +msgstr "Edición %(username)s de perfil" #: mediagoblin/templates/mediagoblin/listings/tag.html:29 msgid "Media tagged with:" -msgstr "" +msgstr "El contenido con la etiqueta:" #: mediagoblin/templates/mediagoblin/listings/tag.html:40 #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 msgid "atom feed" -msgstr "" +msgstr "feed Atom" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" -msgstr "" +msgstr "Envíe su contenido" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Contenido de %(username)s's" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 #: mediagoblin/templates/mediagoblin/user_pages/user.html:30 @@ -250,30 +258,33 @@ msgstr "Lo sentimos, no se ha encontrado el usuario." #: mediagoblin/templates/mediagoblin/user_pages/user.html:37 #: mediagoblin/templates/mediagoblin/user_pages/user.html:57 msgid "Verification needed" -msgstr "" +msgstr "Verificación necesaria" #: mediagoblin/templates/mediagoblin/user_pages/user.html:40 msgid "Almost done! Your account still needs to be verified." -msgstr "" +msgstr "Ya está casi hecho! Su cuenta tiene que ser verificada." #: mediagoblin/templates/mediagoblin/user_pages/user.html:45 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" +"Un e-mail debe llegar en unos momentos con las instrucciones para hacerlo." #: mediagoblin/templates/mediagoblin/user_pages/user.html:49 msgid "In case it doesn't:" -msgstr "" +msgstr "En caso de que no:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:52 msgid "Resend verification email" -msgstr "" +msgstr "Reenviar correo electrónico de verificación" #: mediagoblin/templates/mediagoblin/user_pages/user.html:60 msgid "" "Someone has registered an account with this username, but it still has to be" " verified." msgstr "" +"Alguien ha registrado una cuenta con este nombre de usuario, pero todavía " +"tiene que ser verificado." #: mediagoblin/templates/mediagoblin/user_pages/user.html:66 #, python-format @@ -281,19 +292,21 @@ msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "" +"Si usted es esa persona, pero usted ha perdido su correo electrónico de " +"verificación, usted puede reenviarlo acceder." #: mediagoblin/templates/mediagoblin/user_pages/user.html:76 #, python-format msgid "%(username)s's profile" -msgstr "" +msgstr "Perfil de %(username)s's" #: mediagoblin/templates/mediagoblin/user_pages/user.html:84 msgid "Edit profile" -msgstr "" +msgstr "Editar perfil" #: mediagoblin/templates/mediagoblin/user_pages/user.html:95 #, python-format msgid "View all of %(username)s's media" -msgstr "" +msgstr "Ver todo el contenido de %(username)s's " diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..a7daf2c91cd50bd2dea5da7b64a63ece9b1ac78f GIT binary patch literal 5406 zcmeH~TZ|i58GsKEXlu$X<=RksHqvT0itW9S(BLFXvgsxy+D(`2CQ&JBHTE3alZ@w> zIcL0a6nLiafIw8LDv&BJ68k`S;;j-wEAhfZc>uu^2m}%cP=%DDJ^|l9W3L@25RiC4 zRad+F`OM7u=f9udzuLR!ImOR${yxm#o;S;C^z-MpDD{4pe}Qvw&mN@?!$a^KyfRq- z0P=|X6MP$d1-={p4eo{ay|q|B3?F8F5IzV`!w_z`#&z5{*{vQ<3~-vz$`KL@`D z`|uzyIS;=Bm*Fk=KKR&uN<9SEpy&}mwx~7~xd{|~Za~rR%kX~qB9#5xunm6*KLlsF z`6yh5qHi6FUKU=09+u%xpxE^qT!0TfP`rNyzLWJTl>JXZd2btvoIad}pNHayZ$pvy z5){4v2ob4XfnwKdP{RjH_!L&)K6n_4U7v!F!4MvWUxy!rzl2Z2zd}T)^|u$#e;R)O zO-gm3#Q71NBym0jCC(u{2VWShe-94v6FAex(D0=)9ia&k} z<+)d(`0)X5%Kp9ZDx8H9=dZyL5Z`566e!UF}-&Y{N>IMF3coT}BUxuRBFCe1Tt5D*6 zKQEOypMc`u8&Lf992C87L5aiPp_-n}oJo_QV-C0(r@N_bMzK-H0^Lqc^Z5Sa{xew` zA8`AZ#-Bbm7c8-(W5OsFzLbDXtw5T_;x``TQK9Fm$g)xI4$Eml|6a%9!1AZeIbow7+YN;|q6 zIJaffP@Q6!j!4uC5+T6{uZhdg*m@i#>XQ*dN1Mx~5PK6>SG1Ius8Mi2IUd#95rF z&L+Acs*nt!H4bfSicMH082;Bys=$O(Di5vpL94}nN&8xHsg*|?Z?>#jA7<$A14WqO z-~}WZST9axw$;~3Q<*?w)QWLWs(?CrtWq_G1${eGI@4x|B~bp zCSEZOFAu8=MKtb=YjNjahP|pbq+lBDAZZz=HYiiIL8a$q6*!_?L<$?miYo5`yQM1) ztDNTRq=2_L&+NLVoQ@AMxz?sDl|*;3eYr> zFmgeixJf(8Rg)ei?Svg!y%YHX#E!_D&TyH>VYuj{S#e=AXgReh^++-d(?vUDIs?N* zOebj3c;uDHXP8vZS%H1v)lMDo4Ug^b=kxXVknAE^qVPl+1j?XQ@Zepmpp%R&^72} zd1EXhG&+E)dOfub4vivcjUbb*Q@wLvVrgK7eM6o8-QK)VNa9`;k^s4*bD`q zTDrrjw8z4k99D9wQDS|aaPCltQBu~TebL+yDM2IE=ua+>eGw`*r2=m|9A|hl7uGL! zc14CuA-^DU-uHlV1h?1kyY*J_Z@ys_XM@G+y;!TrQR;Y=P^RK3l)FWRy zV-iD^8@%1G>E)nqVm)8|c=cnYH|8aVwj_(q^}7vBJKN^E&N%Tb&4@0w!pC%YF=|9p z>ii6?|9YioGilb@73LFWvEh!1sp*MC?`%tn{qM)7Wt+&m%eOT(hNo^Zx-ve|RC?Ak z*c8TS`o%OYMueioA<1JRgYPI3 zW$k8|%k%q`(9TU?9!&<*v%@2LI85cwariZ4e!pJKLqqWr@NvO~OkBt1-C<*THgBmz zc@%O&4>Re1J6h!%uhF$6Jrjoh@lUkxtjM&jz|xa fWJd42IN8eHn9)WvT2U*MMo~qBiI4$1FDLa+wTxLT literal 0 HcmV?d00001 diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..4606bf47 --- /dev/null +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,305 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-10 21:24+0000\n" +"Last-Translator: MarkTraceur \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: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Nous avons renvoyé votre e-mail de vérification." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "logo de MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Soumettez des médias" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "vérifiez votre addresse e-mail" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Connexion" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Alimenté par MediaGoblin, un projet GNU" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Bienvenue à GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "Soumettez un fichier" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" +"Si vous avez un compte, vous pouvez Connecter." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" +"Si vous n'avez pas un compte, s'il vous plaît, vous inscrivez." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Connexion" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Connexion manqué" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "Soumettez" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "N'avez-vous toujours un compte?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "En créez un ici!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Créez un compte!" + +#: 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 "" +"Bonjour, %(username)s,\n" +"\n" +"pour activer votre compte de GNU MediaGoblin, ouvrez l'URL suite avec votre navigateur web:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "On édit %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Annulez" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Enregistrez les modifications" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, 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:76 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + + diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..8911785ff9b8003d2146b82adccd80693b97cafc GIT binary patch literal 5217 zcmb7{OKc=Z8Gs8|2uu-+c*cl0ObAE_-)8i^$PqH{2}}%`~@7t$2jB~ zd<`zcf56Yer|wYdKDZ7=4g*=DdQkRFp~&+MDDr(5ejNS?%KD$e9{er*Je=X>m*6rK zdD~Fr%HTFE;4J(d6usVq3-G>Al;^L)PcmMEvi_@3&h0_jXADomm!a6hU;)`e zy#gg}UWel6pTQjd8Wu3%;RX0(D0=-FBC2{ABZ}TLP|jPaxDM}Oyba~t9^_Yz_z-)2 z3yPlKfjjVZDD&^(L*nldD0W|lBHtBw6K=x=_;V=v@HW)&pHTdGKgJh19;*1|iUAaP zpM*`g45#7Oq1g9(Q0({?#5L*oL^9%3+h{)9*CoHjlfp4V&shs_nqU ziFUngl!V&kdAw_NoNA-Hc25toflUji_u`_*Q&;4pP7!CR(^;x}*`90|X4+-tR%wxs z%eh6*aB?z=v`KPn!m+k5#g3i2S+0v-?6hdzRLgOuE}FDs6Lm35yKz3yL*v|DmWS#h z3k$0a!j!5^)sIk8_iS#b)Jm2Q{qY8V&$=9EF4M*8H8H`j|rTqGFW zPb#0^)(flNI3^5p>zukIj=6m8rd}75U(VV|oT@7^n;tBlZ8Wfn!AiR#{8&73WJ#^g ztj>lu#Tpi?BuTa>g512ZhM^mN-JWghcAo8FsaB(La;EfK$A|~YfKXSvas+;}?1RaN zHg~wDJu2k+qnIU;u<+YWE-&3a>lb&h+(ft~Srk{>PcJb*9EmjS8*0p8L0mNJlL@%v z4w%)$#2RPyW+v) zFocx>4X2cMtu9Oyv0lQyRX&Qmx3OlFsf{{9>wieX5mp|UqSI@t zjckwD40U^apnk6?hON0dAAIFj%`A_mmnI@fl$a&&_FYk}iPDkGots{gI6}o8+bLwS zx>0)LxL?aR@9Xxa+LVOp^h_FAr#4AbwMnM?v@#Aam!3k0iKOy1U_W)GV9okC!?0zE z>9O=^f!WORd@Nc?hD?+OS$?E6AXPazrJ#&Dy>dyH8b+b2UX_yNJ_9sGB#fPD<2NZs zUNosuQchSgY7gR~g6I(!c2Ez!AL_vv$;t;?CUR;^@{wSu!$mu52bE&7&A>zy9+~Cq z8`(nwP*v?vEajzF^x>ZO4>h zLjljahw99J;lE|u4%O5xn{@D@2zsR6OsQL0*2}UfUD~9OIDfvX8dNf07)uWwTtH2| zk!Kw)jnZiyGm@&)Jiac?C}5?2wM-wh)+Y)rEfH$e+X@nZ}$$8(Gu5we#6xo353~Tz$#^nls@l7ezl!OYd zh5`0>DA_t{z{U+b%<>{wcTpS$%cIBzTUkq2`PpXN>}DBG9X3;2%pr>G=q9s$E_QBY zU1Q_=R^ab7&IwkyAzFHIeqkY)Kf|wHTx^|wJeWT{KhMPAhTV-to+I-X=Jn!2Yw_{N z=J{!?8CL{bxk+7unt2O*(Ft(vpUc8HZDxbeB+o{2jWr36CFZBmhzJh0tQoX)n!b4L zx<0qI_G}VMm04HA2-JHYlgE0e$14lA~4w(Ylgfx}oFE zkUiE7Wy92HG}qlX-$cKJhLX>SUh(ys11xQ+s>>hKpHZr;w& zlgHH;XnkVY>WJBquWVK-SM7W8naTBs#9c$&TH2<%8I2P*DO($nxNC_VF@TQy$fg}1 zxo>g&Drs`cf36aV{4Y&r*T#vFUMKI{#0-aq1?vYrZNR*;%aLG{CI=clz(n3FN!-T< zEAmx=-hB5!^8dNZv1G=+dv4d~1Vo|RvHh~q*_5VJOjSEZO+J})kawHUh@9_4lbNPg zFwx;$JIJ9bJ-Ns8QQye7F#>azrvwszb^4dZVdA{982H!q7R2G?CWnsxVjREwWK!YKERsN z-caJy^1e;gmanc822`6nNGAP_FUq=`Go1WBrLNd`U>)58?NQRF!zl~Xu^#8Svc=, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-10 21:23+0000\n" +"Last-Translator: velmont \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: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Brukarnamn" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Passord" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "Passorda må vera like." + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "Gjenta passord" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "E-postadresse" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "Registrering er slege av. Orsak." + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "Ein konto med dette brukarnamnet finst allereide." + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"E-postadressa di, og dimed kontoen din er stadfesta. Du kan no logga inn, " +"endra profilen din og lasta opp filer." + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil." + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Send ein ny stadfestingsepost." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "Tittel" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "Adressetittel" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "Adressetittelen kan ikkje vera tom" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "Merkelappar" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Presentasjon" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Heimeside" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "Ugyldeg URL" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "Eit innlegg med denne adressetittelen finst allereie." + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "Ver forsiktig, du redigerer ein annan konto sitt innlegg." + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "Ver forsiktig, du redigerer ein annan konto sin profil." + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "Fil" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "Du må velja ei fil." + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "Fila verkar ikkje å vera ei gyldig biletefil." + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "Johoo! Opplasta!" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "MediaGoblin-logo" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Last opp" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "Stadfest epostadressa di" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Logg inn" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Driven av MediaGoblin, eit GNU-prosjekt" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Velkomen til GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "Last opp" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "Har du ein konto? Logg inn." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "Har du ingen konto? Registrer deg." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Logg inn" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Innlogging feila!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "Send" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "Har du ingen konto?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Lag ein!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Lag ein konto." + +#: 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 "" +"Hei %(username)s,\n" +"\n" +"opna den følgjande adressa i netlesaren din for å aktivera kontoen din:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Redigerer %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Avbryt" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Lagra" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Redigerar profilen til %(username)s" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "Merkelappar:" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "atom-feed" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Last opp" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "%(username)s sin mediafiler" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "Fann ingen slik brukar" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "Treng stadfesting" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "Nesten klart. Du treng berre stadfesta kontoen din." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +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:49 +msgid "In case it doesn't:" +msgstr "I tilfelle det ikkje skjer:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "Send ein ny epost" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" +"Det finst allereie ein konto med det brukarnamnet, men den kontoen treng " +"stadfesting." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, python-format +msgid "" +"If you are that person but you've lost your verification email, you can log in and resend it." +msgstr "" +"Viss dette er deg, kan du logga inn for å få " +"tilsendt ny epost med stadfestingslenkje." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)s sin profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "Endra profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "Sjå all media frå %(username)s" + + diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo index ce967d59fec8ad8a2c8fa7d1c881116ea36eaf4b..4dc4ab5f772ebae42247eb44feec1c54b2d3d495 100644 GIT binary patch delta 2117 zcmZ{lPiS049LGm#lbR-JW0W+_p|e6YHObc0s*r|gTthDXlbS!E2lbctW?x3$o7v2J zZ&Q14>rK3PSSaX02#TRXQAj;{TD)lSPz4bb_2xwsy!7bzH*d391BUQE@6F8bH^2Y; z)0t17{G$KC#)uH&l>s5nf}7wpxDB2IzXzWIdj^H*182b_;39YoTmp}SZ-Dq0n|M45 z-T)ygZh|MkPry^)SK!0oFJLeD_n>HaMfb6A4GTx0^*!(%@DkV$?G^AzVIH%7yJeega5Smdxr``2EYxhKMt}%?+-PEcmgktQQS1BXG5^aMByRzQxxjSw#^@GdwC zegH~vw|(FTa17r+gM7h#@Hw#O5g{&sb0B+i9gM*b!H2+JgbS}?h{M+Wb#P?2HlTZ( z$vb)-U=z)H{swPn(6R4P+s900g zE+HpVWj3(kG~V;1Z9s_^l>es9T$jYWHX%s^6J(~6!pi5xLZ~x{)x3wrmkBN0OjM}p z^-O0mJQWKKKF2%7Nj9)M6k@@I%Bj|l18*wFu>)pbW zeSJ&hNK&Tj>`o_!U6KXx8)-9pmgc0APAOB@ zt?j9p%A#}ae*--!Yt|u~b?chn^gK51$a(25flg8mUV3!FWP9hE+s98dDwJBEKa_;i zb_T)c1L7hZRXlN3ykYZ_@PU^ZMUe{Smd-Y2_<+xn--?QyEc+7jPcFVX3It^?b(E7% z%VNoHA-kbme@o6%^KS2J4R#rED9ZO>*u<6p*^pJM+wnr4;5@~g@gxt)w00;J%W)ow z`8dj3w-Wg#>cpu?qc3c}U)kIljiLmMO;nLl^3}~T+{~4?eXr|6WaTB526B zBV8Ojv7E0bI+J81N;+w;%A|E0t>VAn2U?-MutHIaxKhznV?`s^2veqTmm6Ov6se>+ zIDE1(FM|!V19#(IApH1|h$KgC-zl~hGeN^G=Tv5q?v>W~glATU2>a8Re)~O_YAkeSh4c8lMzR|e! zP$Z63^Dx`PpLTj4X0@A^YiiF&JXThWGAv<~ eO!;#50W@hz;8!7$Ri(nV%SBOPPVks0iGKm-qK8lb delta 557 zcmXZY!7IaI9LMo58{70_8yiM32ZfQXtZ5ufo1$$8GtweI?cgA^?Z81lCx3xjZloNA zT_|$nL=KB^aZy^iy0~~h@$2b%J>Ory=lgt~-*Mkd@2OU8G>gc5y~rSLU=R;*3ZMS# zt_Bek^&Hk>1|7JJjhO$hcd?DSh#H<_3*KM{J|ivV8_j68iy?LvHl}U#;1(7!iB3)# z$0c;*5jNo^sv!4RgJo2WUr`16M27q@Sy6NT?RVn}wGTbG=QKn*S)A}fC4NAa>V@@O*gKJq$Gyo&BIX^9B_fmYu}CyJ9ZRK3Y0X?!`ZDcUegPrsLz4gi diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index 68b7a0b5..43f65af6 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po @@ -2,13 +2,14 @@ # Copyright (C) 2011 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # +# , 2011. msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-10 18:05+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-08-10 23:16+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" @@ -19,50 +20,52 @@ msgstr "" #: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 msgid "Username" -msgstr "" +msgstr "Nome de Usuário" #: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 msgid "Password" -msgstr "" +msgstr "Senha" #: mediagoblin/auth/forms.py:34 msgid "Passwords must match." -msgstr "" +msgstr "Senhas devem ser iguais." #: mediagoblin/auth/forms.py:36 msgid "Confirm password" -msgstr "" +msgstr "Confirmar senha" #: mediagoblin/auth/forms.py:39 msgid "Email address" -msgstr "" +msgstr "Endereço de email" #: mediagoblin/auth/views.py:40 msgid "Sorry, registration is disabled on this instance." -msgstr "" +msgstr "Desculpa, o registro está desativado neste momento." #: mediagoblin/auth/views.py:55 msgid "Sorry, a user with that name already exists." -msgstr "" +msgstr "Desculpe, um usuário com este nome já existe." #: mediagoblin/auth/views.py:152 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" 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:158 msgid "The verification key or user id is incorrect" -msgstr "" +msgstr "A chave de verificação ou nome usuário estão incorretos." #: mediagoblin/auth/views.py:179 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 msgid "Resent your verification email." -msgstr "" +msgstr "O email de verificação foi reenviado." #: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 msgid "Title" -msgstr "" +msgstr "Título" #: mediagoblin/edit/forms.py:29 msgid "Slug" @@ -74,15 +77,15 @@ msgstr "" #: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 msgid "Tags" -msgstr "" +msgstr "Tags" #: mediagoblin/edit/forms.py:38 msgid "Bio" -msgstr "" +msgstr "Biográfia" #: mediagoblin/edit/forms.py:41 msgid "Website" -msgstr "" +msgstr "Website" #: mediagoblin/edit/forms.py:43 msgid "Improperly formed URL" @@ -102,49 +105,51 @@ msgstr "" #: mediagoblin/submit/forms.py:29 msgid "File" -msgstr "" +msgstr "Arquivo" #: mediagoblin/submit/views.py:45 msgid "You must provide a file." -msgstr "" +msgstr "Você deve fornecer um arquivo." #: mediagoblin/submit/views.py:48 msgid "The file doesn't seem to be an image!" -msgstr "" +msgstr "O arquivo não parece ser uma imagem!" #: mediagoblin/submit/views.py:96 msgid "Woohoo! Submitted!" -msgstr "" +msgstr "Eba! Enviado!" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" -msgstr "" +msgstr "GNU MediaGoblin" #: mediagoblin/templates/mediagoblin/base.html:45 msgid "Mediagoblin logo" -msgstr "" +msgstr "Logo de Mediagoblin" #: mediagoblin/templates/mediagoblin/base.html:51 msgid "Submit media" -msgstr "" +msgstr "Enviar mídia" #: mediagoblin/templates/mediagoblin/base.html:62 msgid "verify your email!" -msgstr "" +msgstr "Verifique seu email!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "Login" -msgstr "" +msgstr "Login" #: mediagoblin/templates/mediagoblin/base.html:88 msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" +"Powered by MediaGoblin, a GNU project" #: mediagoblin/templates/mediagoblin/root.html:21 msgid "Welcome to GNU MediaGoblin!" -msgstr "" +msgstr "Bemvindo a GNU Mediagoblin!" #: mediagoblin/templates/mediagoblin/root.html:26 msgid "Submit an item" @@ -153,7 +158,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 #, python-format msgid "If you have an account, you can Login." -msgstr "" +msgstr "Se você tem conta, você pode Entrar ." #: mediagoblin/templates/mediagoblin/root.html:37 #, python-format @@ -161,33 +166,35 @@ msgid "" "If you don't have an account, please Register." msgstr "" +"Se você não tem conta, por favor Registrar " +"." #: mediagoblin/templates/mediagoblin/auth/login.html:26 msgid "Log in" -msgstr "" +msgstr "Entrar" #: mediagoblin/templates/mediagoblin/auth/login.html:29 msgid "Login failed!" -msgstr "" +msgstr "Login falhou!" #: mediagoblin/templates/mediagoblin/auth/login.html:34 #: mediagoblin/templates/mediagoblin/auth/register.html:30 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 #: mediagoblin/templates/mediagoblin/submit/start.html:32 msgid "Submit" -msgstr "" +msgstr "Enviar" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Don't have an account yet?" -msgstr "" +msgstr "Ainda não tem conta?" #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Create one here!" -msgstr "" +msgstr "Crie uma aqui!" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" -msgstr "" +msgstr "Criar uma conta!" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -199,24 +206,29 @@ msgid "" "\n" "%(verification_url)s" msgstr "" +"Olá %(username)s,\n" +"\n" +"Para ativar sua conta GNU MediaGoblin, visite este endereço no seu navegador:\n" +"\n" +"%(verification_url)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "" +msgstr "Editando %(media_title)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:36 msgid "Cancel" -msgstr "" +msgstr "Cancelar" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 msgid "Save changes" -msgstr "" +msgstr "Salvar mudanças" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "" +msgstr "Editando perfil de %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:29 msgid "Media tagged with:" @@ -226,11 +238,11 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 msgid "atom feed" -msgstr "" +msgstr "atom feed" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" -msgstr "" +msgstr "Envie sua mídia" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -240,35 +252,37 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 #: mediagoblin/templates/mediagoblin/user_pages/user.html:30 msgid "Sorry, no such user found." -msgstr "" +msgstr "Desculpe, tal usuário não encontrado." #: mediagoblin/templates/mediagoblin/user_pages/user.html:37 #: mediagoblin/templates/mediagoblin/user_pages/user.html:57 msgid "Verification needed" -msgstr "" +msgstr "Verificação necessária" #: mediagoblin/templates/mediagoblin/user_pages/user.html:40 msgid "Almost done! Your account still needs to be verified." -msgstr "" +msgstr "Quase pronto! Sua conta precisa de verificação." #: mediagoblin/templates/mediagoblin/user_pages/user.html:45 msgid "" "An email should arrive in a few moments with instructions on how to do so." -msgstr "" +msgstr "Receberá um email com instruções de como fazer." #: mediagoblin/templates/mediagoblin/user_pages/user.html:49 msgid "In case it doesn't:" -msgstr "" +msgstr "Caso contrário:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:52 msgid "Resend verification email" -msgstr "" +msgstr "Reenviar email de verificação" #: mediagoblin/templates/mediagoblin/user_pages/user.html:60 msgid "" "Someone has registered an account with this username, but it still has to be" " verified." msgstr "" +"Alguém já registrou uma conta com este nome, mas ainda tem que ser " +"verificada." #: mediagoblin/templates/mediagoblin/user_pages/user.html:66 #, python-format @@ -276,15 +290,17 @@ msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "" +"Se você é essa pessoa, mas você perdeu seu e-mail de verificação, você pode " +"efetuar login e reenviá-la." #: mediagoblin/templates/mediagoblin/user_pages/user.html:76 #, python-format msgid "%(username)s's profile" -msgstr "" +msgstr "Perfil de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/user.html:84 msgid "Edit profile" -msgstr "" +msgstr "Editar perfil" #: mediagoblin/templates/mediagoblin/user_pages/user.html:95 #, python-format diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..361846d4d930e4d83983757e96d7170cdb4863fc GIT binary patch literal 5629 zcma)=ON<;x8OIASgbV>f0tCXV#?r>S%FgVpgYy`BH}PZbI9fZ4cN3FDBC6@BnJK5I zd(@BJOcan{r69rqaX*}7F9VaHM z_58Pbs=oT3|L<%6;g&<+Qv9s(@00vH^iEk#fByC^r9R5?@8Ak}=#Wy!z|VpYfmh1) zPeHb*zk=@pUjuIj{{!9v-tca}z8$=s^_}2N;92lCa2xzI_!Rhl@OhA<>f7K4!S8`z z1b+mM!8^I+BKSk_6!<#$5%8WHl)4qX0E!+4pJzeQ?;GHI!5@Hf{v~h# zz6^dGT;$8ofTuvww*!h^G59E$fy>~lpxE^WxC-8SqrZOx`~d4sP|iOA%Dn?n_{uTHj_+L=YKZsFs|0PiT_BbeZjX;Ul zmqF3zn;^gHMLxv7pMaw8tDx-vGbnQ20Og!~NPKSwUj&~AFM}&=ei-~JDEatXQ2hN5 z5S7%8AM$t`D9;x_(enY2E$Sgq?s)<{3 z$bJKg{C)6K;MYOX>m~36_;XO=^ExPY-AypQ0zL+c{l5prUw@JyEiC4#O(HY2OX-nR zkCM3OLaR;~JxFYC?Xds;$vg>{(!=YsyHBi`bxsUz*BNy(9L8y;yK!Xe`ms1qvKZ8z0ftUFfk+Qjvo?KaiPNZX-tp-u;J9(J`!61Qu$i?q=_yQhco&_-FR z_gpsMX__T@khwTYbsXtIye9&?u})(zD$0_v-dSS6}*OQscLL6Rf^3UHi3LAxUOt+iZG*xFMFy}5lqA!Tc z&&8e4Me0F^(COjjS`D8VytFIIk0lawM=Eocbv&{W-mrKj4C6gf`)vnbR7Jb|TBN6Zkq0aZ@3gTvwgUd%YNeN9S&*b?L+!9J!6yj!&`>-z;hXXt} zlWt+$ccu8l>nu=5G7bNBHEytg%bL~AB;2(DSk|M^n$+r9xryzQ0XC^p`BJ$S;S+Il zk^KJ(Zi=?0h#|#;1H!Rn8F3b8s`HT!L=}>u8`~6Z+loV2B~X3p9#vqwbyb8`XQtoh zyrg~GKk66J#+&_EZB-ds{Xr4tczI~DV9-=s@gBL^)t&Lw{6UtD+AAwX@_A9sIO!i= zpUEUKVwt*|grYptk8;_&a(G?x2otZ^Ad}7Nl8?rIs(n-m@ z07D6)+7T8~kCgnc9xZs;*LOkKwyPd>(6E8Pu7%Q5oC-a9XVR>st5ITO9np8FLl-S;(cY6AA|+^~8vK+NvG<`$ z>&j&DkamVQ3t?k_qG)_|g_%-Njq}|G{!cNoJ@3HUB|D0ftZ^ajyKduD-cK7laa))5 z*HzkG7B9 z)o2}SwbDpb#VRHFqZ82I~ zTfM*4UR+#^7FJuW_0{{9o_)4ltgW?{?zm$ys)I{Q_aAMqE-lqAoWHO!b?IueRinda zj1!HW@d&#!`!v1^jf;*86(y<7*7B^^xOciw%<9>su|dUj>5grEZ^vb|b2hSYfF%~= zwmxM#Hq@==ea*XT5>3+JK&8;OU-^!MktyjgcT;}7{$!<25=S$#I5abLy+P}uCIg$A z8oFoX zc`;n|6T_s(oR^2_N?&m7jk|f^wKPc_nqsOFrMXLN@naSb8lg5WaCLPN>AS^=a*Lm? zkXQ~_#T+HeH=D1f+YZL%q)b%?GfP)gfx2eII+aIP_m>YGX3UzHEu+?fIN-c|zJ?)& z00&v~44yUq<~$i*-OpkUztwnk#sm@w;tHpbyhUhb#4?eQVQ561yIrcppeM0_n;4C9FDK=g9G&$0g~fu^s`&`Ut)k4e((osdCNPQ3B*ij1omZ0E%NR)v zmkZHJ-oLs()NgWA)#9tm$keL0mX}p>OQBUVPK8%?ybb;Rd{)F8gZ+pLUE;i}`&0Fc znh_5dMUsbYb#m$glJ`0*Dl@S;K|o+#ZDcMOSh!Utyjai7Sd4CDJeL+IjF2U^lRJ7j zicu+LX~_U_n%5laiUvdJO^kfogB+DIe`q?%K`jpJB}vOku8d}7`@y798wFQflT6Y; zWxOww0ruH8;jYi|A&dz_T-{IPt>yeIW2nnl1_@IMOeb@M80(oN%9$p} z-6^9i>#j*8&C6@a1$krRwF4>K)KnKC1SxkYGN(Jw5!qByd5dQ=xoG~VTr$*TFFMU= zKs9kso*7<14&Ei2m9{WN5m>2L)PH93Du#g=M!O`^eoTDj1<`rO*HMMSf<50cctit| zB9p9~J}m04S{F%VaB-D&6^)@QRut}#IY-CEJc8%z2cuE$i{*7uvM_WbXez}{b$Vb) z$pieMQnx!6cc()AJ##-l`=ilkTN#JCmh?dLgff zRcPiZwXV+58kZ>{9Kx6-@7P8>MRwDKu`7@0iqoh!^){(t8Alk>uymB, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-10 21:52+0000\n" +"Last-Translator: gap \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: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Nume de utilizator" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Parolă" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "Parolele trebuie să fie identice." + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "Reintroduceți parola" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "Adresa de e-mail" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe această instanță." + +#: mediagoblin/auth/views.py:55 +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:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Adresa dvs. de e-mail a fost confirmată. Puteți să vă autentificați, să vă " +"modificați profilul și să trimiteți imagini!" + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "Cheie de verificare sau user ID incorect." + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "E-mail-ul de verificare a fost retrimis." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "Titlu" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "Identificator" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "Identificatorul nu poate să lipsească" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "Etichete" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Biografie" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Sit Web" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "Adresă URL incorectă" + +#: mediagoblin/edit/views.py:54 +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:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "Editați fișierul unui alt utilizator. Se recomandă prudență." + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "Editați profilul unui utilizator. Se recomandă prudență." + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "Fișier" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "Trebuie să selectați un fișier." + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "Fișierul nu pare a fi o imagine!" + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "Gata, trimis!" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "Logo MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Transmiteți fișier" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "verificați e-mail-ul!" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Autentificare" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Construit cu MediaGoblin, un proiect GNU" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Bun venit la GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "Trimite un fișier" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "" +"Dacă aveți deja un cont, vă puteți autentifica." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" +"Dacă nu aveți cont, vă rugăm să vă înregistrați." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Autentificare" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Autentificare nereușită!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "Trimite" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "Nu aveți un cont?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Creați-l aici!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Creați un cont!" + +#: 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 "" +"Bună, %(username)s,\n" +"\n" +"pentru activarea contului tău GNU MediaGoblin, accesează adresa următoare:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Editare %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Anulare" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Salvează modificările" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Editare profil %(username)s" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "Etichete:" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "flux atom" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Trimite fișierele tale" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "Fișierele lui %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +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:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "Confirmare necesară" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "Aproape gata! Este necesară confirmarea contului dvs." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "Veți primi în scurt timp un mesaj prin e-mail cu instrucțiuni." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +msgid "In case it doesn't:" +msgstr "Dacă nu primiți mesajul:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "Retrimite mesajul de verificare" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" +"Cineva s-a înscris pe site cu acest nume de utilizator, dar nu a fost " +"confirmat încă." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, python-format +msgid "" +"If you are that person but you've lost your verification email, you can log in and resend it." +msgstr "" +"Dacă dvs. sunteți persoana respectivă și nu mai aveți e-mail-ul de " +"verificare, puteți să vă autentificați pentru " +"a-l retrimite." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "Editare profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "Toate fișierele lui %(username)s" + + diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..a70b1fef8130a4406cfc4e637d76b718986663e6 GIT binary patch literal 5487 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, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"PO-Revision-Date: 2011-08-10 21:28+0000\n" +"Last-Translator: JLP \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: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Uporabniško ime" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Geslo" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "Gesli morata biti enaki." + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "Potrdite geslo" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "E-poštni naslov" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "Oprostite, prijava za ta izvod ni omogočena." + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, a user with that name already exists." +msgstr "Oprostite, uporabnik s tem imenom že obstaja." + +#: mediagoblin/auth/views.py:152 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj " +"profil in pošljete slike." + +#: mediagoblin/auth/views.py:158 +msgid "The verification key or user id is incorrect" +msgstr "Potrditveni ključ ali uporabniška identifikacija je napačna" + +#: mediagoblin/auth/views.py:179 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Ponovno pošiljanje potrditvene e-pošte." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +msgid "Title" +msgstr "Naslov" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "Oznaka" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "Oznaka ne sme biti prazna" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "Oznake" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Biografija" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Spletna stran" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "Napačno oblikovan URL" + +#: mediagoblin/edit/views.py:54 +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:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo." + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "Urejate uporabniški profil. Nadaljujte pazljivo." + +#: mediagoblin/submit/forms.py:29 +msgid "File" +msgstr "Datoteka" + +#: mediagoblin/submit/views.py:45 +msgid "You must provide a file." +msgstr "Podati morate datoteko." + +#: mediagoblin/submit/views.py:48 +msgid "The file doesn't seem to be an image!" +msgstr "Kot kaže datoteka ni slika." + +#: mediagoblin/submit/views.py:96 +msgid "Woohoo! Submitted!" +msgstr "Juhej! Poslano." + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "Logotip MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Pošlji vsebino" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "Preverite svojo e-pošto." + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Prijava" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Stran poganja MediaGoblin, del projekta GNU" + +#: mediagoblin/templates/mediagoblin/root.html:21 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Dobrodošli v GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:26 +msgid "Submit an item" +msgstr "Pošljite datoteko" + +#: mediagoblin/templates/mediagoblin/root.html:31 +#, python-format +msgid "If you have an account, you can Login." +msgstr "Če imate račun, se lahko Prijavite." + +#: mediagoblin/templates/mediagoblin/root.html:37 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "Če računa še nimate, se Registrirajte." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Prijava" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Neuspešna prijava." + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:32 +msgid "Submit" +msgstr "Pošlji" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "Še nimate računa?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Ustvarite si ga." + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Ustvarite račun." + +#: 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 "" +"Pozdravljeni, %(username)s\n" +"\n" +"Za aktivacijo svojega računa GNU MediaGoblin odprite\n" +"naslednji URL v svojem spletnem brskalniku:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Urejanje %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Prekliči" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Shrani spremembe" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Urejanje profila – %(username)s" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +msgid "Media tagged with:" +msgstr "Vsebina označena z:" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +msgid "atom feed" +msgstr "Vir Atom" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Pošljite svojo vsebino" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "Vsebina uporabnika %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +msgid "Sorry, no such user found." +msgstr "Oprostite, tega uporabnika ni bilo moč najti." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +msgid "Verification needed" +msgstr "Potrebna je potrditev" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +msgid "Almost done! Your account still needs to be verified." +msgstr "Skoraj ste zaključili. Račun je potrebno le še potrditi." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +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:49 +msgid "In case it doesn't:" +msgstr "Če je ne prejmete:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +msgid "Resend verification email" +msgstr "Ponovno pošlji potrditveno e-pošto" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" +"Nekdo je s tem uporabniškim imenom že registriral račun, vendar mora biti še" +" potrjen." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#, python-format +msgid "" +"If you are that person but you've lost your verification email, you can log in and resend it." +msgstr "" +"Če ste ta oseba vi, a ste izgubili potrditveno e-pošto, se lahko prijavite in jo ponovno pošljete." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil – %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +msgid "Edit profile" +msgstr "Uredi profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#, python-format +msgid "View all of %(username)s's media" +msgstr "Prikaži vso vsebino uporabnika %(username)s" + + From d990a3799846a06ada11805ca4f2806eb1bf8b5e Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 20:26:22 -0500 Subject: [PATCH 050/134] We should save the entry *after* we add the queued_task_id. --- 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 59d8fe3f..53711236 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -88,11 +88,11 @@ def submit_start(request): # Add queued filename to the entry entry['queued_media_file'] = queue_filepath - entry.save(validate=True) # queue it for processing result = process_media_initial.delay(unicode(entry['_id'])) entry['queued_task_id'] = result.task_id + entry.save(validate=True) add_message(request, SUCCESS, _('Woohoo! Submitted!')) From f64e5250906401a3d5a5fc587521bc31e146859c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 10 Aug 2011 21:03:16 -0500 Subject: [PATCH 051/134] Generate the ObjectId() manually instead of via .save() --- mediagoblin/submit/views.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index ba13b755..a3a58400 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -20,6 +20,7 @@ from string import split from werkzeug.utils import secure_filename +from mediagoblin.db.util import ObjectId from mediagoblin.util import ( render_to_response, redirect, cleaned_markdown_conversion, \ convert_to_tag_list_of_dicts) @@ -51,6 +52,7 @@ def submit_start(request): # create entry and save in database entry = request.db.MediaEntry() + entry['_id'] = ObjectId() entry['title'] = ( request.POST['title'] or unicode(splitext(filename)[0])) @@ -66,10 +68,6 @@ def submit_start(request): entry['tags'] = convert_to_tag_list_of_dicts( request.POST.get('tags')) - # Save, just so we can get the entry id for the sake of using - # it to generate the file path - entry.save(validate=False) - # Generate a slug from the title entry.generate_slug() From f6bf68cae5f2907924e126a3a2f3a2f015292323 Mon Sep 17 00:00:00 2001 From: Caleb Forbes Davis V Date: Thu, 11 Aug 2011 00:50:16 -0500 Subject: [PATCH 052/134] Feature #446 - Render the submission form using the render_divs macro - Currently there are individual calls to wtforms_util.render_field_div for each field in the media submit form, which is too verbose - Matched the field ordering in submit/form.py to the verbose version - hacks the correct textareafield rendering with hard-coded rows and columns. - TODO - figure out how to pass the textarea dimensions with **kwargs --- mediagoblin/submit/forms.py | 2 +- mediagoblin/templates/mediagoblin/submit/start.html | 5 +---- mediagoblin/templates/mediagoblin/utils/wtforms.html | 6 +++++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index 241d32dc..4519b057 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -22,11 +22,11 @@ from mediagoblin.util import fake_ugettext_passthrough as _ class SubmitStartForm(wtforms.Form): + file = wtforms.FileField(_('File')) title = wtforms.TextField( _('Title'), [wtforms.validators.Length(min=0, max=500)]) description = wtforms.TextAreaField('Description of this work') - file = wtforms.FileField(_('File')) tags = wtforms.TextField( _('Tags'), [tag_length_validator]) diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html index eb34c2e2..3a40850d 100644 --- a/mediagoblin/templates/mediagoblin/submit/start.html +++ b/mediagoblin/templates/mediagoblin/submit/start.html @@ -24,10 +24,7 @@ method="POST" enctype="multipart/form-data">

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

- {{ wtforms_util.render_field_div(submit_form.file) }} - {{ wtforms_util.render_field_div(submit_form.title) }} - {{ wtforms_util.render_textarea_div(submit_form.description) }} - {{ wtforms_util.render_field_div(submit_form.tags) }} + {{ wtforms_util.render_divs(submit_form) }}
diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index e3d8e137..3b6cff15 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -23,7 +23,11 @@ {% if field.description -%}
{{ _(field.description) }}
{%- endif %} -
{{ field }}
+ {% if field.type == "TextAreaField" %} +
{{ field(rows=8, cols=20) }}
+ {% else %} +
{{ field }}
+ {% endif %} {%- if field.errors -%} {% for error in field.errors %}
From d07be8119de3b2e10ca37d43dfecd4239dc09aba Mon Sep 17 00:00:00 2001 From: Caleb Forbes Davis V Date: Thu, 11 Aug 2011 10:15:30 -0500 Subject: [PATCH 053/134] eliminates textarea handling since rows cols not required in HTML5 --- .../templates/mediagoblin/utils/wtforms.html | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index 3b6cff15..2639522a 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -23,30 +23,7 @@ {% if field.description -%}
{{ _(field.description) }}
{%- endif %} - {% if field.type == "TextAreaField" %} -
{{ field(rows=8, cols=20) }}
- {% else %} -
{{ field }}
- {% endif %} - {%- if field.errors -%} - {% for error in field.errors %} -
- {{ error }} -
- {% endfor %} - {%- endif %} -
-{%- endmacro %} - -{# Generically render a textarea - # ... mostly the same thing except it includes rows and cols #} -{% macro render_textarea_div(field, rows=8, cols=20) %} -
-
{{ _(field.label.text) }}
- {% if field.description -%} -
{{ _(field.description) }}
- {%- endif %} -
{{ field(rows=rows, cols=cols) }}
+
{{ field }}
{%- if field.errors -%} {% for error in field.errors %}
From f016fc65056c03fd64d40b918da670281835f76d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 11:29:14 -0500 Subject: [PATCH 054/134] Adding slightly clearer docs to MountStorage. --- mediagoblin/storage.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index 88c748ce..3968fa29 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -290,16 +290,29 @@ class MountStorage(StorageInterface): """ Experimental "Mount" virtual Storage Interface - This isn't an interface to some real storage, instead - it's a redirecting interface, that redirects requests - to other "StorageInterface"s. - For example, requests for ["store1", "a"] to first - storage with the path ["a"], etc. + This isn't an interface to some real storage, instead it's a + redirecting interface, that redirects requests to other + "StorageInterface"s. + + For example, say you have the paths: + + 1. ['user_data', 'cwebber', 'avatar.jpg'] + 2. ['user_data', 'elrond', 'avatar.jpg'] + 3. ['media_entries', '34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg'] + + You could mount media_entries under CloudFileStorage and user_data + under BasicFileStorage. Then 1 would be passed to + BasicFileStorage under the path ['cwebber', 'avatar.jpg'] and 3 + would be passed to CloudFileStorage under + ['34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg']. + + In other words, this is kind of like mounting /home/ and /etc/ + under different filesystems on your operating system... but with + mediagoblin filestorages :) - To set this up, you currently need to call the mount() - method with the target path and a backend, that shall - be available under that target path. - You have to mount things in a sensible order, + To set this up, you currently need to call the mount() method with + the target path and a backend, that shall be available under that + target path. You have to mount things in a sensible order, especially you can't mount ["a", "b"] before ["a"]. """ def __init__(self, **kwargs): From 07934b442f7cd3abae18eecdf533de004f88e6b1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 11:30:26 -0500 Subject: [PATCH 055/134] Moving things around a bit/commenting in the submit view to make the workflow clearer --- mediagoblin/submit/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index d4858c87..1e8c6a68 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -87,9 +87,13 @@ def submit_start(request): # Add queued filename to the entry entry['queued_media_file'] = queue_filepath - # queue it for processing + # Save now so we have this data before kicking off processing + entry.save(validate=False) + result = process_media_initial.delay(unicode(entry['_id'])) - entry['queued_task_id'] = result.task_id + + # Save the task id + entry['queued_task_id'] = unicode(result.task_id) entry.save(validate=True) add_message(request, SUCCESS, _('Woohoo! Submitted!')) From 7219983f8e017fe9163cbe5e28bf6314d91aa7a8 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 12 Aug 2011 02:13:58 +0200 Subject: [PATCH 056/134] Feature #298 - Create environment tarball * It's now possible to import/export your environment from/to a tarball. ./bin/gmg env_export [ -c mediagoblin_local.ini ] test.tar and ./bin/gmg env_import [ -c mediagoblin_local.ini ] test.tar --- mediagoblin/gmg_commands/import_export.py | 196 +++++++++++++--------- 1 file changed, 121 insertions(+), 75 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 2c626da1..56b3913d 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -24,11 +24,14 @@ from mediagoblin.storage import BasicFileStorage from mediagoblin.init import setup_storage, setup_global_and_app_config import shlex +import shutil import tarfile import subprocess import os.path import os import re +import sys + def import_export_parse_setup(subparser): # TODO: Add default @@ -47,28 +50,33 @@ def import_export_parse_setup(subparser): '--cache_path', default='/tmp/mediagoblin/', help='') + def _export_database(db, args): print "\n== Exporting database ==\n" - + command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format( mongodump_path=args.mongodump_path, database=db.name, mongodump_cache=args._cache_path['database']) - + p = subprocess.Popen( shlex.split(command)) - + p.wait() print "\n== Database exported ==\n" + def _export_media(db, args): - print "\n== Exporting media ==\n" - + media_cache = BasicFileStorage( args._cache_path['media']) + # TODO: Add export of queue files + queue_cache = BasicFileStorage( + args._cache_path['queue']) + for entry in db.media_entries.find(): for name, path in entry['media_files'].items(): mc_file = media_cache.get_file(path, mode='wb') @@ -78,85 +86,54 @@ def _export_media(db, args): print(mc_file) print(entry) + print "\n== Media exported ==\n" + + +def _import_media(db, args): + """ + Import media files + + Must be called after _import_database() + """ + print "\n== Importing media ==\n" + + media_cache = BasicFileStorage( + args._cache_path['media']) + + # TODO: Add import of queue files queue_cache = BasicFileStorage( args._cache_path['queue']) - qc_file = queue_cache.get_file(entry['queued_media_file'], mode='wb') - qc_file.write( - mg_globals.queue_store.get_file(entry['queued_media_file'], mode='rb').read()) - print(qc_file) + for entry in db.media_entries.find(): + for name, path in entry['media_files'].items(): + media_file = mg_globals.public_store.get_file(path, mode='wb') + media_file.write( + media_cache.get_file(path, mode='rb').read()) + + print(media_file) + print(entry) + + print "\n== Media imported ==\n" - print "\n== Media exported ==\n" def _import_database(db, args): - command = '{mongorestore_path} -d {database} -o {mongodump_cache}'.format( + print "\n== Importing database ==\n" + command = '{mongorestore_path} -d {database}' + '{backup_dir}/{database}'.format( mongorestore_path=args.mongorestore_path, database=db.name, - mongodump_cache=args.mongodump_cache) + backup_dir=args._cache_path['database']) + + print command + + p = subprocess.Popen( + shlex.split(command)) + + p.wait() + def env_import(args): - config, validation_result = read_mediagoblin_config(args.conf_file) - connection, db = setup_connection_and_db_from_config( - config['mediagoblin'], use_pymongo=True) - - tf = tarfile.open( - args.tar_file, - mode='r|gz') - - tf.extractall(args.extract_path) - -def _setup_paths(args): - args._cache_path = dict() - PATH_MAP = { - 'media': 'media', - 'queue': 'queue', - 'database': 'database'} - - for key, val in PATH_MAP.items(): - args._cache_path[key] = os.path.join(args.cache_path, val) - - return args - -def _create_archive(args): - print "\n== Compressing to archive ==\n" - tf = tarfile.open( - args.tar_file, - mode='w|gz') - with tf: - for root, dirs, files in os.walk(args.cache_path): - print root, dirs, files - - everything = [] - everything.extend(dirs) - everything.extend(files) - - print everything - - for d in everything: - directory_path = os.path.join(root, d) - virtual_path = os.path.join( - root.replace(args.cache_path, 'mediagoblin-data/'), d) - - # print 'dir', directory_path, '\n', 'vir', virtual_path - - tarinfo = tf.gettarinfo( - directory_path, - arcname=virtual_path) - - tf.addfile(tarinfo) - - print 'added ', d - - ''' - mg_data = tf.gettarinfo( - args.cache_path, - arcname='mediagoblin-data') - - tf.addfile(mg_data) - ''' - print "\n== Archiving done ==\n" - -def env_export(args): + args.cache_path += 'mediagoblin-data' args = _setup_paths(args) setup_global_and_app_config(args.conf_file) @@ -166,6 +143,49 @@ def env_export(args): connection, db = setup_connection_and_db_from_config( config['mediagoblin'], use_pymongo=True) + tf = tarfile.open( + args.tar_file, + mode='r|gz') + + tf.extractall(args.cache_path) + + # Import database from extracted data + _import_database(db, args) + + _import_media(db, args) + + +def _setup_paths(args): + args._cache_path = dict() + PATH_MAP = { + 'media': 'media', + 'queue': 'queue', + 'database': 'database'} + + for key, val in PATH_MAP.items(): + args._cache_path[key] = os.path.join(args.cache_path, val) + + return args + + +def _create_archive(args): + print "\n== Compressing to archive ==\n" + + tf = tarfile.open( + args.tar_file, + mode='w|gz') + + with tf: + tf.add(args.cache_path, 'mediagoblin-data/') + + print "\n== Archiving done ==\n" + + +def _clean(args): + shutil.rmtree(args.cache_path) + + +def _check(args): if os.path.exists(args.tar_file): overwrite = raw_input( 'The output file already exists. ' @@ -173,10 +193,36 @@ def env_export(args): '(yes/no)> ') if not overwrite == 'yes': print "Aborting." - return + + return False + + if os.path.exists(args.cache_path): + print 'The cache directory must not exist before you run this script' + print 'Cache directory: ', args.cache_path + + return False + + return True + + +def env_export(args): + args = _setup_paths(args) + + if not _check(args): + print "\n== Checks did not pass, exiting ==\n" + sys.exit(0) + + setup_global_and_app_config(args.conf_file) + setup_storage() + + config, validation_result = read_mediagoblin_config(args.conf_file) + connection, db = setup_connection_and_db_from_config( + config['mediagoblin'], use_pymongo=True) _export_database(db, args) _export_media(db, args) _create_archive(args) + + _clean(args) From d9204d3a3dd91f63fd43345415ebeb6fc02cc1c8 Mon Sep 17 00:00:00 2001 From: Caleb Forbes Davis V Date: Thu, 11 Aug 2011 19:17:56 -0500 Subject: [PATCH 057/134] uses render_divs for the comments form in media.html for completeness --- 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 afc0d903..9c0a1cca 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -55,7 +55,7 @@
- {{ wtforms_util.render_field_div(comment_form.comment_content) }} + {{ wtforms_util.render_divs(comment_form) }}
From dc49cf600aba92331419a3566f768b061b8102e3 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 20:15:55 -0500 Subject: [PATCH 058/134] Making the users_with_username function call in the register view slightly cleaner --- mediagoblin/auth/views.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 121a8c8e..dc90173e 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -45,10 +45,8 @@ def register(request): if request.method == 'POST' and register_form.validate(): # TODO: Make sure the user doesn't exist already - users_with_username = \ - request.db.User.find({ - 'username': request.POST['username'].lower() - }).count() + users_with_username = request.db.User.find( + {'username': request.POST['username'].lower()}).count() if users_with_username: register_form.username.errors.append( From 0bf099d7536b5f5f876fa21e4c72f132b7c757a8 Mon Sep 17 00:00:00 2001 From: Alejandro Villanueva Date: Tue, 14 Jun 2011 11:03:56 -0500 Subject: [PATCH 059/134] Checks if the email(lowercase) have been used before to register a user --- mediagoblin/auth/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index dc90173e..61164be8 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -47,10 +47,15 @@ def register(request): users_with_username = request.db.User.find( {'username': request.POST['username'].lower()}).count() + users_with_email = request.db.User.find( + {'email': request.POST['email'].lower()}).count() if users_with_username: register_form.username.errors.append( _(u'Sorry, a user with that name already exists.')) + elif users_with_email: + register_form.email.errors.append( + _(u'Sorry, that email address has already been taken.')) else: # Create the user From 873e4e9d2da8a3976de6c44838f517cfc314d620 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 20:34:12 -0500 Subject: [PATCH 060/134] Also normalize user's emails to .lower() when we accept the user. --- 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 61164be8..91599e47 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -61,7 +61,7 @@ def register(request): # Create the user user = request.db.User() user['username'] = request.POST['username'].lower() - user['email'] = request.POST['email'] + user['email'] = request.POST['email'].lower() user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( request.POST['password']) user.save(validate=True) From 9f6ea47586f78370c42dc9b45782f398bebf7d2e Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 20:37:21 -0500 Subject: [PATCH 061/134] If both the username and the email checks fail, warn about both at the same time --- mediagoblin/auth/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 91599e47..ce6b5dfc 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -50,14 +50,18 @@ def register(request): users_with_email = request.db.User.find( {'email': request.POST['email'].lower()}).count() + extra_validation_passes = True + if users_with_username: register_form.username.errors.append( _(u'Sorry, a user with that name already exists.')) - elif users_with_email: + extra_validation_passes = False + if users_with_email: register_form.email.errors.append( _(u'Sorry, that email address has already been taken.')) + extra_validation_passes = False - else: + if extra_validation_passes: # Create the user user = request.db.User() user['username'] = request.POST['username'].lower() From 788272f30034fb2f917496197e317226d21aad2e Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 11 Aug 2011 22:44:47 -0500 Subject: [PATCH 062/134] PEP-8ing the keyword argument passing here --- 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 55f42141..9120196f 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -166,7 +166,7 @@ def verify_email(request): return redirect( request, 'mediagoblin.user_pages.user_home', - user = user['username']) + user=user['username']) def resend_activation(request): From 758eb746547cc8c6c52135fd88bee11b5f81d3d4 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 12 Aug 2011 13:01:41 +0200 Subject: [PATCH 063/134] Document changes to storage_system_from_config Chris suggested changing the docs for storage_system_from_config: - The only param is a config section. - The format of that section is much simpler, no prefix. --- mediagoblin/storage.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index d338fb31..ec3bc1b5 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import os -import re import shutil import urlparse import uuid @@ -443,29 +442,25 @@ def clean_listy_filepath(listy_filepath): return cleaned_filepath -def storage_system_from_config(config): +def storage_system_from_config(config_section): """ - Utility for setting up a storage system from the paste app config. + Utility for setting up a storage system from a config section. - Note that a special argument may be passed in to the paste_config - which is "${storage_prefix}_storage_class" which will provide an + Note that a special argument may be passed in to + the config_section which is "storage_class" which will provide an import path to a storage system. This defaults to "mediagoblin.storage:BasicFileStorage" if otherwise undefined. Arguments: - - paste_config: dictionary of config parameters - - storage_prefix: the storage system we're setting up / will be - getting keys/arguments from. For example 'publicstore' will - grab all arguments that are like 'publicstore_FOO'. + - config_section: dictionary of config parameters Returns: An instantiated storage system. Example: storage_system_from_config( - {'publicstore_base_url': '/media/', - 'publicstore_base_dir': '/var/whatever/media/'}, - 'publicstore') + {'base_url': '/media/', + 'base_dir': '/var/whatever/media/'}) Will return: BasicFileStorage( @@ -474,7 +469,7 @@ def storage_system_from_config(config): """ # This construct is needed, because dict(config) does # not replace the variables in the config items. - config_params = dict(config.iteritems()) + config_params = dict(config_section.iteritems()) if 'storage_class' in config_params: storage_class = config_params['storage_class'] From 035c976fb2ccbbc7dc73cc6ceb4b5ed8d4523561 Mon Sep 17 00:00:00 2001 From: Karen Rustad Date: Tue, 2 Aug 2011 18:01:02 -0700 Subject: [PATCH 064/134] adds feature #458 -- given a column number, limits the number of items in a row (and adds divs saying so). No CSS styling to make these demarcations visible, though --- .../mediagoblin/utils/object_gallery.html | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index 03b85b17..c5e890fc 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -18,15 +18,46 @@ {% from "mediagoblin/utils/pagination.html" import render_pagination %} +{% macro media_grid(media_list, col_number=5) %} + {% set num_items = media_list.count() %} + {% set col_counter = 0 %} + {% set row_counter = 0 %} + {% set item_counter = 0 %} + + {% set num_rows = num_items // col_number %} + {% if num_items % col_number != 0 %} + {% set num_rows = num_rows + 1 %} + {% endif %} + + +{%- endmacro %} + {% block object_gallery_content -%} {% if media_entries and media_entries.count() %} - {% for entry in media_entries %} -
- - -
- {% endfor %} + {{ media_grid(media_entries) }}
{% if pagination_base_url %} {# different url, so set that and don't keep the get params #} From 38bf03c6aae118870c1c58873c2aa72bfbf34887 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 12 Aug 2011 09:55:50 -0500 Subject: [PATCH 065/134] Converting object_gallery() from a block to a macro and updating usages of it The main motivation here is that this lets us pass in a specific number of col_number --- .../templates/mediagoblin/listings/tag.html | 4 +++- mediagoblin/templates/mediagoblin/root.html | 6 +++--- .../mediagoblin/user_pages/gallery.html | 4 +++- .../mediagoblin/user_pages/user.html | 5 ++++- .../mediagoblin/utils/object_gallery.html | 21 +++++++++++++++---- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index a013797f..a43355a7 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -17,6 +17,8 @@ #} {% extends "mediagoblin/base.html" %} +{% from "mediagoblin/utils/object_gallery.html" import object_gallery %} + {% block mediagoblin_head %} - {% include "mediagoblin/utils/object_gallery.html" %} + {{ object_gallery(request, media_entries, pagination) }}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index a4e19984..06beb436 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -17,6 +17,8 @@ #} {% extends "mediagoblin/base.html" %} +{% from "mediagoblin/utils/object_gallery.html" import object_gallery %} + {% block mediagoblin_content %}

{% trans %}Welcome to GNU MediaGoblin!{% endtrans %}

@@ -41,7 +43,5 @@ {% endif %} {% endif %} - {# temporarily, an "image gallery" that isn't one really ;) #} - - {% include "mediagoblin/utils/object_gallery.html" %} + {{ object_gallery(request, media_entries, pagination) }} {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index a66a547e..ff935ac4 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -17,6 +17,8 @@ #} {% extends "mediagoblin/base.html" %} +{% from "mediagoblin/utils/object_gallery.html" import object_gallery %} + {% block mediagoblin_head %} - {% include "mediagoblin/utils/object_gallery.html" %} + {{ object_gallery(request, media_entries, pagination) }}
{%- endmacro %} -{% block object_gallery_content -%} + +{# + Render a media gallery with pagination. + + Args: + - request: Request + - media_entries: pymongo cursor of media entries + - pagination: Paginator object + - pagination_base_url: If you want the pagination to point to a + different URL, point it here + - col_number: How many columns per row (default 5) +#} +{% macro object_gallery(request, media_entries, pagination, + pagination_base_url=None, col_number=5) %} {% if media_entries and media_entries.count() %} - {{ media_grid(media_entries) }} + {{ media_grid(request, media_entries, col_number=col_number) }}
{% if pagination_base_url %} {# different url, so set that and don't keep the get params #} @@ -70,4 +83,4 @@ There doesn't seem to be any media here yet...

{% endif %} -{% endblock %} +{% endmacro %} From 8f12c9b24cb6fef5d7cc332e5e5e8d5587ba38e0 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 12 Aug 2011 17:04:34 +0200 Subject: [PATCH 066/134] Feature #298 - Create environment tarball * Reviewed the code and fixed some bugs --- mediagoblin/gmg_commands/import_export.py | 130 +++++++++++++--------- 1 file changed, 78 insertions(+), 52 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 56b3913d..f6651327 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -51,44 +51,6 @@ def import_export_parse_setup(subparser): help='') -def _export_database(db, args): - print "\n== Exporting database ==\n" - - command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format( - mongodump_path=args.mongodump_path, - database=db.name, - mongodump_cache=args._cache_path['database']) - - p = subprocess.Popen( - shlex.split(command)) - - p.wait() - - print "\n== Database exported ==\n" - - -def _export_media(db, args): - print "\n== Exporting media ==\n" - - media_cache = BasicFileStorage( - args._cache_path['media']) - - # TODO: Add export of queue files - queue_cache = BasicFileStorage( - args._cache_path['queue']) - - for entry in db.media_entries.find(): - for name, path in entry['media_files'].items(): - mc_file = media_cache.get_file(path, mode='wb') - mc_file.write( - mg_globals.public_store.get_file(path, mode='rb').read()) - - print(mc_file) - print(entry) - - print "\n== Media exported ==\n" - - def _import_media(db, args): """ Import media files @@ -117,26 +79,31 @@ def _import_media(db, args): def _import_database(db, args): + """ + Restore mongo database from ___.bson files + """ print "\n== Importing database ==\n" - command = '{mongorestore_path} -d {database}' - '{backup_dir}/{database}'.format( - mongorestore_path=args.mongorestore_path, - database=db.name, - backup_dir=args._cache_path['database']) - print command - - p = subprocess.Popen( - shlex.split(command)) + p = subprocess.Popen([ + args.mongorestore_path, + '-d', db.name, + os.path.join(args._cache_path['database'], db.name)]) + + print p p.wait() + print "\n== Database imported ==\n" + def env_import(args): - args.cache_path += 'mediagoblin-data' - args = _setup_paths(args) - + """ + Restore mongo database and media files from a tar archive + """ + # args.cache_path += 'mediagoblin-data' setup_global_and_app_config(args.conf_file) + + # Creates mg_globals.public_store and mg_globals.queue_store setup_storage() config, validation_result = read_mediagoblin_config(args.conf_file) @@ -149,13 +116,20 @@ def env_import(args): tf.extractall(args.cache_path) + args.cache_path += 'mediagoblin-data' + args = _setup_paths(args) + # Import database from extracted data _import_database(db, args) _import_media(db, args) + # _clean(args) def _setup_paths(args): + """ + Populate ``args`` variable with cache subpaths + """ args._cache_path = dict() PATH_MAP = { 'media': 'media', @@ -169,6 +143,9 @@ def _setup_paths(args): def _create_archive(args): + """ + Create the tar archive + """ print "\n== Compressing to archive ==\n" tf = tarfile.open( @@ -182,10 +159,16 @@ def _create_archive(args): def _clean(args): + """ + Remove cache directory + """ shutil.rmtree(args.cache_path) -def _check(args): +def _export_check(args): + """ + Run security checks for export command + """ if os.path.exists(args.tar_file): overwrite = raw_input( 'The output file already exists. ' @@ -205,10 +188,53 @@ def _check(args): return True +def _export_database(db, args): + print "\n== Exporting database ==\n" + + command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format( + mongodump_path=args.mongodump_path, + database=db.name, + mongodump_cache=args._cache_path['database']) + + p = subprocess.Popen([ + args.mongodump_path, + '-d', db.name, + '-o', args._cache_path['database']]) + + p.wait() + + print "\n== Database exported ==\n" + + +def _export_media(db, args): + print "\n== Exporting media ==\n" + + media_cache = BasicFileStorage( + args._cache_path['media']) + + # TODO: Add export of queue files + queue_cache = BasicFileStorage( + args._cache_path['queue']) + + for entry in db.media_entries.find(): + for name, path in entry['media_files'].items(): + mc_file = media_cache.get_file(path, mode='wb') + mc_file.write( + mg_globals.public_store.get_file(path, mode='rb').read()) + + print(mc_file) + print(entry) + + print "\n== Media exported ==\n" + + def env_export(args): + """ + Export database and media files to a tar archive + """ args = _setup_paths(args) - if not _check(args): + if not _export_check(args): print "\n== Checks did not pass, exiting ==\n" sys.exit(0) From fabdccd0114cc75f2191419dcd708d7858718a45 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 12 Aug 2011 13:14:35 -0500 Subject: [PATCH 067/134] Missing multi=True closing this migration, oops :) --- mediagoblin/db/migrations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 36bca5b3..171b5c83 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -62,6 +62,7 @@ def mediaentry_remove_thumbnail_file(database): database['media_entries'].update( {'thumbnail_file': {'$exists': True}}, {'$unset': {'thumbnail_file': 1}}, + multi=True) @RegisterMigration(4) From 4b860cb823fd160742ab050f481eb65e389f9a7b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 12 Aug 2011 19:59:19 -0500 Subject: [PATCH 068/134] Create processing errors and raise BadMediaFail on failure to load the image --- mediagoblin/process_media/__init__.py | 8 +++- mediagoblin/process_media/errors.py | 54 +++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 mediagoblin/process_media/errors.py diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 8e12ca4d..00402d7e 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -21,6 +21,8 @@ from celery.task import task from mediagoblin import mg_globals as mgg from contextlib import contextmanager +from mediagoblin.process_media.errors import BadMediaFail + THUMB_SIZE = 180, 180 MEDIUM_SIZE = 640, 640 @@ -51,7 +53,11 @@ def process_media_initial(media_id): mgg.queue_store, queued_filepath, 'source') - thumb = Image.open(queued_filename) + 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": diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py new file mode 100644 index 00000000..f2ae87ff --- /dev/null +++ b/mediagoblin/process_media/errors.py @@ -0,0 +1,54 @@ +# 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 . + +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" % ( + self.__class__.__module__, self.__class__.__name__) + + def __init__(self, **metadata): + self.metadata = metadata or {} + + def generate_error_message(self): + """ + Generate an error to display to users in the panel. + + Uses this class's general_message, possibly interpolated + with any metadata in self.metadata['error_message_vars'], + if appropriate. + """ + return self.general_message % self.metadata.get('error_message_vars', {}) + + +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.') From 6c50c2106816c920ef404dea641a8eac8c5914eb Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 07:48:34 -0500 Subject: [PATCH 069/134] Add fail_error and fail_metadata fields to MediaEntry and relevant migration --- mediagoblin/db/migrations.py | 17 +++++++++++++++++ mediagoblin/db/models.py | 10 +++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 171b5c83..5456b248 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -75,3 +75,20 @@ def mediaentry_add_queued_task_id(database): {'queued_task_id': {'$exists': False}}, {'$set': {'queued_task_id': None}}, multi=True) + + +@RegisterMigration(5) +def mediaentry_add_fail_error_and_metadata(database): + """ + Add 'fail_error' and 'fail_metadata' fields to media entries + """ + collection = database['media_entries'] + collection.update( + {'fail_error': {'$exists': False}}, + {'$set': {'fail_error': None}}, + multi=True) + + collection.update( + {'fail_metadata': {'$exists': False}}, + {'$set': {'fail_metadata': {}}}, + multi=True) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 0dcb6ce8..982883d7 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -171,6 +171,9 @@ class MediaEntry(Document): - 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' @@ -197,7 +200,12 @@ class MediaEntry(Document): # The following should be lists of lists, in appropriate file # record form - 'attachment_files': list} + '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'] From 4a477e246d07a4c26f084db2596caf3310b78609 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 10:59:34 -0500 Subject: [PATCH 070/134] Proper handling of processor failures, working as hoped! BaseProcessingFail based exceptions recorded and marked appropriately in the database. Other exceptions also caught and marked (or rather not marked) appropriately in the database as well. --- mediagoblin/process_media/__init__.py | 76 +++++++++++++++++++++++---- mediagoblin/submit/views.py | 26 ++++++--- 2 files changed, 83 insertions(+), 19 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 00402d7e..d6cdd747 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -15,13 +15,14 @@ # along with this program. If not, see . import Image -from mediagoblin.db.util import ObjectId -from celery.task import task -from mediagoblin import mg_globals as mgg from contextlib import contextmanager +from celery.task import task, Task +from celery import registry -from mediagoblin.process_media.errors import BadMediaFail +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 @@ -34,6 +35,7 @@ def create_pub_filepath(entry, filename): unicode(entry['_id']), filename]) + @contextmanager def closing(callback): try: @@ -41,12 +43,66 @@ def closing(callback): finally: pass -@task -def process_media_initial(media_id): - workbench = mgg.workbench_manager.create_workbench() - entry = mgg.database.MediaEntry.one( - {'_id': ObjectId(media_id)}) +################################ +# 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)}) + process_image(entry) + 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. + """ + media_id = args[0] + entry = mgg.database.MediaEntry.one( + {'_id': ObjectId(media_id)}) + + entry[u'state'] = u'failed' + + # 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. + entry[u'fail_error'] = exc.exception_path + entry[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) + entry[u'fail_error'] = None + entry[u'fail_metadata'] = {} + + entry.save() + + +process_media = registry.tasks[ProcessMedia.name] + + +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( @@ -107,8 +163,6 @@ def process_media_initial(media_id): media_files_dict['original'] = original_filepath if medium_processed: media_files_dict['medium'] = medium_filepath - entry['state'] = u'processed' - entry.save() # clean up workbench workbench.destroy_self() diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 1e8c6a68..25b3664b 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -14,9 +14,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import uuid + from os.path import splitext from cgi import FieldStorage -from string import split from werkzeug.utils import secure_filename @@ -27,7 +28,7 @@ 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_initial +from mediagoblin.process_media import process_media from mediagoblin.messages import add_message, SUCCESS @@ -87,15 +88,24 @@ def submit_start(request): # 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. + # (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=False) - - result = process_media_initial.delay(unicode(entry['_id'])) - - # Save the task id - entry['queued_task_id'] = unicode(result.task_id) 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.apply_async( + [unicode(entry['_id'])], {}, + task_id=task_id) + add_message(request, SUCCESS, _('Woohoo! Submitted!')) return redirect(request, "mediagoblin.user_pages.user_home", From 6788b4123ef00241d6b6c80ca93d655e4307d6e3 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 12:21:06 -0500 Subject: [PATCH 071/134] Capture and properly handle errors. Handled in several places: - In the run() of the ProcessMedia itself for handled (BaseProcessingFail derived) errors (best to do these not in on_failure because the errors are highlighted in celeryd in a way that looks inappropriate for when the errors are well handled) - In ProcessMedia.on_failure() for all other errors - In the submit view where all exceptions are caught, media is marked at having failed, then the error is re-raised. (The reason for this is that users running in "lazy" mode will get errors propagated by celery and so on_failure won't run for them.) --- mediagoblin/process_media/__init__.py | 56 ++++++++++++++++----------- mediagoblin/submit/views.py | 21 ++++++++-- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index d6cdd747..69e4fc45 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -59,7 +59,14 @@ class ProcessMedia(Task): """ entry = mgg.database.MediaEntry.one( {'_id': ObjectId(media_id)}) - process_image(entry) + + # 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() @@ -71,33 +78,36 @@ class ProcessMedia(Task): we can use that to get more information about the failure and store that for conveying information to users about the failure, etc. """ - media_id = args[0] - entry = mgg.database.MediaEntry.one( - {'_id': ObjectId(media_id)}) - - entry[u'state'] = u'failed' - - # 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. - entry[u'fail_error'] = exc.exception_path - entry[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) - entry[u'fail_error'] = None - entry[u'fail_metadata'] = {} - - entry.save() + entry_id = args[0] + mark_entry_failed(entry_id, exc) process_media = registry.tasks[ProcessMedia.name] +def mark_entry_failed(entry_id, exc): + # 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 diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 25b3664b..1ba17954 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -28,7 +28,7 @@ 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 +from mediagoblin.process_media import process_media, mark_entry_failed from mediagoblin.messages import add_message, SUCCESS @@ -102,9 +102,22 @@ 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.apply_async( - [unicode(entry['_id'])], {}, - task_id=task_id) + 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[u'_id'], exc) + # re-raise the exception + raise add_message(request, SUCCESS, _('Woohoo! Submitted!')) From 2e5ea6b9b79244a0436264c5f1b606ec5328b70e Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 12:52:22 -0500 Subject: [PATCH 072/134] @task decorator no longer used! Removing that import. --- mediagoblin/process_media/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 69e4fc45..18836919 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -17,7 +17,7 @@ import Image from contextlib import contextmanager -from celery.task import task, Task +from celery.task import Task from celery import registry from mediagoblin.db.util import ObjectId @@ -86,6 +86,18 @@ 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): From ff520ff53b7a17204c64beea28c9dbde13c5cf26 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 12:52:56 -0500 Subject: [PATCH 073/134] Converting multi-line-string-comment to a real comment. --- mediagoblin/process_media/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 18836919..e1289a4c 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -147,11 +147,9 @@ def process_image(entry): with closing(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. - """ + # 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 From 58d717064455c5e0de61f2b09519568bc4a3594a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 13 Aug 2011 19:48:31 -0500 Subject: [PATCH 074/134] Updated extracted translations --- .../i18n/en/LC_MESSAGES/mediagoblin.po | 74 ++++++++++--------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 0de5ca62..9c46ebe8 100644 --- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-08-08 22:53-0500\n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,26 +41,30 @@ msgstr "" msgid "Sorry, registration is disabled on this instance." msgstr "" -#: mediagoblin/auth/views.py:55 +#: mediagoblin/auth/views.py:57 msgid "Sorry, a user with that name already exists." msgstr "" -#: mediagoblin/auth/views.py:152 +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:159 msgid "" "Your email address has been verified. You may now login, edit your " "profile, and submit images!" msgstr "" -#: mediagoblin/auth/views.py:158 +#: mediagoblin/auth/views.py:165 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:186 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 msgid "Resent your verification email." msgstr "" -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "" @@ -100,19 +104,19 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "" -#: mediagoblin/submit/forms.py:29 +#: mediagoblin/submit/forms.py:25 msgid "File" msgstr "" -#: mediagoblin/submit/views.py:45 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:48 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "" -#: mediagoblin/submit/views.py:96 +#: mediagoblin/submit/views.py:94 msgid "Woohoo! Submitted!" msgstr "" @@ -142,20 +146,20 @@ msgid "" "href=\"http://gnu.org/\">GNU project
" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:21 +#: mediagoblin/templates/mediagoblin/root.html:23 msgid "Welcome to GNU MediaGoblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:26 +#: mediagoblin/templates/mediagoblin/root.html:28 msgid "Submit an item" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:31 +#: mediagoblin/templates/mediagoblin/root.html:33 #, python-format msgid "If you have an account, you can Login." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:37 +#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" "If you don't have an account, please %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 msgid "Sorry, no such user found." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 msgid "Verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 msgid "Almost done! Your account still needs to be verified." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +#: 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:49 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 msgid "In case it doesn't:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 msgid "Resend verification email" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "" "Someone has registered an account with this username, but it still has to" " be verified." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#: 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:76 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 #, python-format msgid "%(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 #, python-format msgid "View all of %(username)s's media" msgstr "" +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "" + From e3e9b8fcc962621e39a56748a7d34793a39e6bc6 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 14 Aug 2011 07:53:24 -0500 Subject: [PATCH 075/134] Switch BaseProcessingFail.exception_path's separator from period to colon Also removing .generator_error_message() which doesn't make sense really... we need to get the message when we don't have an instance of the exception, and this method requires an instance. --- mediagoblin/process_media/errors.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py index f2ae87ff..f8ae9ab2 100644 --- a/mediagoblin/process_media/errors.py +++ b/mediagoblin/process_media/errors.py @@ -29,22 +29,12 @@ class BaseProcessingFail(Exception): @property def exception_path(self): - return u"%s.%s" % ( + return u"%s:%s" % ( self.__class__.__module__, self.__class__.__name__) def __init__(self, **metadata): self.metadata = metadata or {} - def generate_error_message(self): - """ - Generate an error to display to users in the panel. - - Uses this class's general_message, possibly interpolated - with any metadata in self.metadata['error_message_vars'], - if appropriate. - """ - return self.general_message % self.metadata.get('error_message_vars', {}) - class BadMediaFail(BaseProcessingFail): """ From 6ee9c719025f954bfc996f11b4a89219f635a17f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 14 Aug 2011 07:55:08 -0500 Subject: [PATCH 076/134] Method to get the failure exception object for a MediaEntry, if appropriate. --- mediagoblin/db/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 982883d7..b6e52441 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -297,6 +297,13 @@ class MediaEntry(Document): def 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 util.import_component(self['fail_error']) + class MediaComment(Document): """ From 01c75c7ebaeee707271773c37f111ff9075d3656 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 14 Aug 2011 07:56:10 -0500 Subject: [PATCH 077/134] Processing panel view Now you can view your failed and in-process media items! --- mediagoblin/static/css/base.css | 12 ++++ .../user_pages/processing_panel.html | 67 +++++++++++++++++++ mediagoblin/user_pages/routing.py | 6 +- mediagoblin/user_pages/views.py | 52 +++++++++++++- 4 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 mediagoblin/templates/mediagoblin/user_pages/processing_panel.html diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 59c2f49d..a421bb4d 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -291,3 +291,15 @@ ul.mediaentry_tags li { margin: 0px 5px 0px 0px; padding: 0px; } + + +/* media processing panel */ + +table.media_panel { + width: 100%; +} + +table.media_panel th { + font-weight: bold; + padding-bottom: 4px; +} \ No newline at end of file diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html new file mode 100644 index 00000000..abc7efd3 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -0,0 +1,67 @@ +{# +# 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 %}Media processing panel{% endtrans %}

+ +

+ {% trans %}You can track the state of media being processed for your gallery here.{% endtrans %} +

+ +

{% trans %}Media in-processing{% endtrans %}

+ +{% if processing_entries.count() %} + + + + + + + {% for media_entry in processing_entries %} + + + + + + {% endfor %} +
TitleWhen submittedStatus
{{ media_entry['title'] }}{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}
+{% else %} +

{% trans %}No media in-processing{% endtrans %}

+{% endif %} + +{% if failed_entries.count() %} +

{% trans %}These uploads failed to process:{% endtrans %}

+ + + + + + + + {% for media_entry in failed_entries %} + + + + + + {% endfor %} +
TitleWhen submittedReason for failure
{{ media_entry['title'] }}{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}{{ media_entry.get_fail_exception().general_message }}
+{% endif %} +{% endblock %} diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py index 3be0617d..bf9f12ab 100644 --- a/mediagoblin/user_pages/routing.py +++ b/mediagoblin/user_pages/routing.py @@ -33,4 +33,8 @@ user_routes = [ controller="mediagoblin.user_pages.views:atom_feed"), Route('mediagoblin.user_pages.media_post_comment', '/{user}/m/{media}/comment/add/', - controller="mediagoblin.user_pages.views:media_post_comment")] + controller="mediagoblin.user_pages.views:media_post_comment"), + Route('mediagoblin.user_pages.processing_panel', + '/{user}/panel/', + controller="mediagoblin.user_pages.views:processing_panel"), + ] diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index fb72a421..d4ff1fce 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -1,4 +1,4 @@ -# GNU MediaGoblin -- federated, autonomous media hosting +# MediaGoblin -- federated, autonomous media hosting # Copyright (C) 2011 Free Software Foundation, Inc # # This program is free software: you can redistribute it and/or modify @@ -175,3 +175,53 @@ def atom_feed(request): url=entry.url_for_self(request.urlgen)) return feed.get_response() + + +@require_active_login +def processing_panel(request): + """ + Show to the user what media is still in conversion/processing... + and what failed, and why! + """ + # Get the user + user = request.db.User.find_one( + {'username': request.matchdict['user'], + 'status': 'active'}) + + # Make sure the user exists and is active + if not user: + return exc.HTTPNotFound() + elif user['status'] != u'active': + return render_to_response( + request, + 'mediagoblin/user_pages/user.html', + {'user': user}) + + # XXX: Should this be a decorator? + # + # 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'] + or request.user.is_admin): + # No? Let's simply redirect to this user's homepage then. + return redirect( + request, 'mediagoblin.user_pages.user_home', + user=request.matchdict['user']) + + # Get media entries which are in-processing + processing_entries = request.db.MediaEntry.find( + {'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'], + 'state': 'failed'}).sort('created', DESCENDING) + + # Render to response + return render_to_response( + request, + 'mediagoblin/user_pages/processing_panel.html', + {'user': user, + 'processing_entries': processing_entries, + 'failed_entries': failed_entries}) From 68f3ffbe8272c58b0421ad57f49374723838f0e4 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 14 Aug 2011 09:12:43 -0500 Subject: [PATCH 078/134] Malicious uploads test with fake but not really image files working! :) --- mediagoblin/tests/test_submission.py | 59 +++++++++++++++++----------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index a7248255..9ae129cd 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -156,7 +156,7 @@ class TestSubmission: util.clear_test_template_context() response = self.test_app.post( '/submit/', { - 'title': 'Malicious Upload 2' + 'title': 'Malicious Upload 1' }, upload_files=[( 'file', EVIL_FILE)]) @@ -164,33 +164,46 @@ class TestSubmission: form = context['submit_form'] assert form.file.errors == ['The file doesn\'t seem to be an image!'] - # NOTE: The following 2 tests will fail. These can be uncommented - # after http://bugs.foocorp.net/issues/324 is resolved and - # bad files are handled properly. + # NOTE: The following 2 tests will ultimately fail, but they + # *will* pass the initial form submission step. Instead, + # they'll be caught as failures during the processing step. # Test non-supported file with .jpg extension # ------------------------------------------- - #util.clear_test_template_context() - #response = self.test_app.post( - # '/submit/', { - # 'title': 'Malicious Upload 2' - # }, upload_files=[( - # 'file', EVIL_JPG)]) + util.clear_test_template_context() + response = self.test_app.post( + '/submit/', { + 'title': 'Malicious Upload 2' + }, upload_files=[( + 'file', EVIL_JPG)]) + response.follow() + assert_equal( + urlparse.urlsplit(response.location)[2], + '/u/chris/') - #context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] - #form = context['submit_form'] - #assert form.file.errors == ['The file doesn\'t seem to be an image!'] + entry = mg_globals.database.MediaEntry.find_one( + {'title': 'Malicious Upload 2'}) + assert_equal(entry['state'], 'failed') + assert_equal( + entry['fail_error'], + u'mediagoblin.process_media.errors:BadMediaFail') # Test non-supported file with .png extension # ------------------------------------------- - #util.clear_test_template_context() - #response = self.test_app.post( - # '/submit/', { - # 'title': 'Malicious Upload 3' - # }, upload_files=[( - # 'file', EVIL_PNG)]) - - #context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] - #form = context['submit_form'] - #assert form.file.errors == ['The file doesn\'t seem to be an image!'] + util.clear_test_template_context() + response = self.test_app.post( + '/submit/', { + 'title': 'Malicious Upload 3' + }, upload_files=[( + 'file', EVIL_PNG)]) + response.follow() + assert_equal( + urlparse.urlsplit(response.location)[2], + '/u/chris/') + entry = mg_globals.database.MediaEntry.find_one( + {'title': 'Malicious Upload 3'}) + assert_equal(entry['state'], 'failed') + assert_equal( + entry['fail_error'], + u'mediagoblin.process_media.errors:BadMediaFail') From 0445100b30a2236539a5695b172b5256c0460ca2 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 16 Aug 2011 08:18:38 -0500 Subject: [PATCH 079/134] Pulled down latest translations --- .../i18n/eo/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5561 bytes .../i18n/eo/LC_MESSAGES/mediagoblin.po | 319 ++++++++++++++++++ .../i18n/ja/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 6281 bytes .../i18n/ja/LC_MESSAGES/mediagoblin.po | 310 +++++++++++++++++ .../i18n/zh_TW/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 5387 bytes .../i18n/zh_TW/LC_MESSAGES/mediagoblin.po | 310 +++++++++++++++++ 6 files changed, 939 insertions(+) create mode 100644 mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po create mode 100644 mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..114ab7c0ebf4c33f53390840b0190e714907e557 GIT binary patch literal 5561 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 Ql`d#7^j9uXSaVwa7Y|C6mH+?% literal 0 HcmV?d00001 diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..ea19af01 --- /dev/null +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,319 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# , 2011. +# Fernando Inocencio , 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" +"PO-Revision-Date: 2011-08-15 20:33+0000\n" +"Last-Translator: fajro \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: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "Uzantnomo" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "Pasvorton" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "Pasvortoj devas koincidi. " + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "Retajpu pasvorton" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "Retadreso" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "Bedaŭrinde, registrado estas malaktivita en tiu ĉi instanco." + +#: mediagoblin/auth/views.py:57 +msgid "Sorry, a user with that name already exists." +msgstr "Bedaŭrinde, uzanto kun tiu nomo jam ekzistas." + +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:159 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Vian retadreson estas kontrolita. Vi povas nun ensaluti, redakti vian " +"profilon, kaj alŝuti bildojn!" + +#: mediagoblin/auth/views.py:165 +msgid "The verification key or user id is incorrect" +msgstr "La kontrol-kodo aŭ la uzantonomo ne estas korekta" + +#: mediagoblin/auth/views.py:186 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "Resendi vian kontrol-mesaĝon." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "Titolo" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "Etikedoj" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "Bio" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "Retejo" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/submit/forms.py:25 +msgid "File" +msgstr "Dosiero" + +#: mediagoblin/submit/views.py:46 +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 "" + +#: mediagoblin/submit/views.py:94 +msgid "Woohoo! Submitted!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr " Logogramo de Mediagoblin" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "Alŝuti aŭd-vid-dosieron" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "kontrolu vian retpoŝton! " + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "Ensaluti" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Provizita de MediaGoblin, unu el la " +"GNU projectoj" + +#: mediagoblin/templates/mediagoblin/root.html:23 +msgid "Welcome to GNU MediaGoblin!" +msgstr "Bonvenon al GNU MediaGoblin!" + +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Submit an item" +msgstr "Alŝuti dosieron" + +#: mediagoblin/templates/mediagoblin/root.html:33 +#, python-format +msgid "If you have an account, you can Login." +msgstr "Se vi havas konton, vi povas Ensaluti." + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "" +"Se vi ne havas konton, bonvolu Registriĝi." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "Ensaluti" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "Ensalutado malsukcesis!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:29 +msgid "Submit" +msgstr "Alŝuti" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "Ĉu ankoraŭ sen konto?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "Kreu unu ĉi tie!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Kreu konton!" + +#: 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 "" +"Sal %(username)s,\n" +"\n" +"por aktivigi vian GNU MediaGoblin konton, malfermu la sekvantan URLon en via retumilo:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Editing %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "Nuligi" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "Konservi ŝanĝojn" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Redaktanta profilon de %(username)s'" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 +msgid "Media tagged with:" +msgstr "Dosiero markita kiel:" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:104 +msgid "atom feed" +msgstr "Atom-a informfluado" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Alŝutu vian aŭd-vid-dosieron" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#, python-format +msgid "%(username)s's media" +msgstr "%(username)s-a aŭd-vid-dosiero" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "Uzanto ne trovita." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Verification needed" +msgstr "Kontrolon bezonata" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be verified." +msgstr "Preskaŭ farite! Via konto ankoraŭ devas esti kontrolita." + +#: 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 "" +"Retmesaĝo alvenos post kelkaj momentoj kun instrukcioj pri kiel tion fari." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +msgid "In case it doesn't:" +msgstr "Se tio ne okazas:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +msgid "Resend verification email" +msgstr "Resendu kontrolmesaĝon" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +msgid "" +"Someone has registered an account with this username, but it still has to be" +" verified." +msgstr "" +"Iu registris konton kun tiu ĉi uzantonomo, sed ĝi devas ankoraŭ esti " +"kontrolita." + +#: 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 "" +"Se vi estas tiu sed vi perdis vian kontrolmesaĝon, vi povas ensaluti kaj resendi ĝin." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)s'-a profilo" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 +msgid "Edit profile" +msgstr "Redakti profilo" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 +#, python-format +msgid "View all of %(username)s's media" +msgstr "Rigardu ĉiuj aŭd-vid-dosierojn de %(username)s'" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "Komento" + + diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..78455ad2709820cd5393594c99bde44e5980926d GIT binary patch literal 6281 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, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" +"PO-Revision-Date: 2011-08-14 00:47+0000\n" +"Last-Translator: cwebber \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: ja\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "ユーザネーム" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "パスワード" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "パスワードが一致している必要があります。" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "パスワードを確認" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "メールアドレス" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "申し訳ありませんが、このインスタンスで登録は無効になっています。" + +#: mediagoblin/auth/views.py:57 +msgid "Sorry, a user with that name already exists." +msgstr "申し訳ありませんが、その名前を持つユーザーがすでに存在しています。" + +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:159 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "メアドが確認されています。これで、ログインしてプロファイルを編集し、画像を提出することができます!" + +#: mediagoblin/auth/views.py:165 +msgid "The verification key or user id is incorrect" +msgstr "検証キーまたはユーザーIDが間違っています" + +#: mediagoblin/auth/views.py:186 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "検証メールを再送しました。" + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "タイトル" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "スラグ" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "スラグは必要です。" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "タグ" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "自己紹介" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "URL" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "不適切な形式のURL" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "そのスラグを持つエントリは、このユーザーは既に存在します。" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "あなたは、他のユーザーのメディアを編集しています。ご注意ください。" + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "あなたは、他のユーザーのプロファイルを編集しています。ご注意ください。" + +#: mediagoblin/submit/forms.py:25 +msgid "File" +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:94 +msgid "Woohoo! Submitted!" +msgstr "投稿終了!" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "MediaGoblinロゴ" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "コンテンツを投稿" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "メアドを確認してください!" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "ログイン" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"Powered by MediaGoblin, a GNU project" + +#: mediagoblin/templates/mediagoblin/root.html:23 +msgid "Welcome to GNU MediaGoblin!" +msgstr "GNU MediaGoblinへようこそ!" + +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Submit an item" +msgstr "アイテムを投稿" + +#: mediagoblin/templates/mediagoblin/root.html:33 +#, python-format +msgid "If you have an account, you can Login." +msgstr "もしアカウントが持ったら、ログインできます。" + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "アカウントが持っていなければ、登録してお願いします。" + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "ログイン" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "ログイン失敗!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:29 +msgid "Submit" +msgstr "送信" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "まだアカウントを持っていませんか?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "ここで作成!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +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 "" +"%(username)s様へ\n" +"\n" +"GNU MediaGoblinアカウントを検証にするには、このURLを開いてください。\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "%(media_title)sを編集中" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "キャンセル" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "投稿する" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +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:42 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:104 +msgid "atom feed" +msgstr "Atomフィード" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "コンテンツを投稿" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#, python-format +msgid "%(username)s's media" +msgstr "%(username)sさんのコンテンツ" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "申し訳ありませんが、そのユーザーは見つかりませんでした。" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Verification needed" +msgstr "確認必要" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be verified." +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" +" verified." +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 "%(username)sさんのプロフィール" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 +msgid "Edit profile" +msgstr "プロフィールを編集" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 +#, python-format +msgid "View all of %(username)s's media" +msgstr "%(username)sさんのコンテンツをすべて見る" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "" + + diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 0000000000000000000000000000000000000000..9615e44c791e27e0764e8a265c872b0db189af94 GIT binary patch literal 5387 zcmbW4Yiu0V6~}K|=)*v11Enn>dN(3Upx(7jd2Sv+LP$ds8pVbPJ~W!$y}LWGJLAsG z#w@6kA94JOV?!JpCx*PkV&f!Ef@5s#v{mUtYO7WiYNbj=m3AI0@ujNN_EXjWnLE2) zJA_uX68~~%?mhS1^Z4J%Ushaqh~ei^{Jj%@Z~ZKd7JqKMjhTZehYj7B!7EB@@oWq790a>!M}raF8(FP8o;#yvmp6#6#O!H1|&Q0 zg0%lnL9+J;a25C`kmB)gknG-8BmLh5Vhgqvr1R|rIhX|DD(eF800%%i-vsy&xB#vN z{{emjyzd6aegJ+C#1?EEr1_V?w?D(!FF>;MLj<7c(0(d|8F?cT+!eQuK+X6O% zT69#xJt-5lDIX7^L^tW3x5jjUYXL0K6M~8l?9o zNO5=>r1ibvYH%cYe+8sC{v4$G{VP}x{u6umJZ*^N`jzti?wpai$6UFgdiJ_HWdl}ZMM72B#t%xS7^-nFLo1L){~| zs&R!UMGMdBS)o}bZ&9r@o|=}Ci(9I$nOxU+T5lnP37wm|G^JTaUe2}B3UCLeW{Ykl*d`dT1Xtjc zJW{Cq2#4iqVTcfWLf2MXJgva_#d$n0tVh}Aglbj7N&{6(@l|X5u=%E+=M<>SNS8NG!Zd1mJ}1iZ#y*CJv(X6P-5ShS{Q)f$<kNUFQj^BgcLqBun zK^|w351N#e$(pExQ9k7Y-!siFAuS6Wko^SzpnmBKT4-66{$O0qB=S!)~>EhKD;X4dHj_XFIIj-bLry^Ic({xCl zJYU(TPh0D^7Rr8)nn20;f%c6W!4+1WRzICGn7HQXK15UIxrQ4HovUiKoV=HE2$PgF z6ekqT^m8v$Wrmny=~-Nah^B8WFIV_w6k<3gwP1K_B8>Q(IAnBr0Bd%NX5FyD+s%}k z2ye`#%y5$)64qW3=(u79Au9uvbm#U7RXSw8Q6USE%S->%0`%{Ilf!cB&vnHe0@ zi1Ik@nHUnXF8Ie|35Z!fp3!p&5}plMp`~)D;c$~svQhqWdUw+`xXSw&_){X>hEjlWi!7-II73GYmseRjXoJy@LG7vjbFWAt|B zqBnZ9IM-hqYsLH0+aum&PlVYE-B^J4&RB;t)>E8mwa>Sej?CGUgQbpli*wWVtG!;~ z5^UIK+Kcmt?6$)ZR%#uEk6zcfS7^54V;h3A=N;I5!OU-Jt?@XP9KS zUu5>curu9V`G#^&%zESf_PKrTiT9a3H|tLH(ax=X(#sID#|qfQJ9&J`%fYuotkk~O zx$qiXl~e7J1CKKIa>0B5+>)@#N6WvXcyVSjn7veUC;)!EX+rh!i}U^N{8<(xW10Ri zd!(?$4!)}FLr3ktL(3bDOK)pA4kq*Awhnk_=Izk}c653UmWC05zS0{f;E6kZ!G5Fl zTAxzLgY)JXCFJ~+^ZL0``$>85S|oZOJ!qS?Pfa2Ah%i!IymFl09J2?`73WS@Rg*6? z<&PY9bk6QPO}907_fFdj`%7K@rPeki#d+sAs>I*ZX)oC44?APy$fmt8Qa+M5(YN?9 zuxd^DRxX?N3Ul_pUis-$u~W$({H$`%J#xu8aJt&sHM~R(b`+e+lPIK0z?j|EYDU7;Pr`-10r5{ju?2YedHj1p*YiTcb{LjW^smmQ99P?9ywbP66f%Q-8LqR=l}UiLiO5Rvydu+ zjI`V#coe8*@Lo!!FQ7rI%en{}-yQ4o-o0F0*heSn7^vjV9vgOhy6oYh(2_7?me(=w zzCG)X&NG=V2%XbCObaV9^94C5M?}wir=2an^aIMOwVF9cPs5Mu|HPs6?al%^K^`XX z9P;5#jIw1~#huCH-jxIBVW{iykk>jLLKZ1F_JKJRK?s{4Lq{QZQab|~FAHOYqtCr} z-g7z+c%z5h!F`cyE~xhAlb6X(as~#A3rA#b0^g-JE)!sgA<6>1Dnl6|IdcaV;3*_f q>YD8IS{}GA(^++mdae75Geh#cZs%J_TJ^`1yp9kW1hjhZ5c?12Y!R3M literal 0 HcmV?d00001 diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..d8f8c98d --- /dev/null +++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,310 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" +"PO-Revision-Date: 2011-08-14 00:47+0000\n" +"Last-Translator: cwebber \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: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 +msgid "Username" +msgstr "使用者名稱" + +#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 +msgid "Password" +msgstr "密碼" + +#: mediagoblin/auth/forms.py:34 +msgid "Passwords must match." +msgstr "密碼必須一至" + +#: mediagoblin/auth/forms.py:36 +msgid "Confirm password" +msgstr "確認密碼" + +#: mediagoblin/auth/forms.py:39 +msgid "Email address" +msgstr "電子郵件位置" + +#: mediagoblin/auth/views.py:40 +msgid "Sorry, registration is disabled on this instance." +msgstr "抱歉, 這個項目已經被暫停註冊." + +#: mediagoblin/auth/views.py:57 +msgid "Sorry, a user with that name already exists." +msgstr "抱歉, 這個使用者名稱已經存在." + +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:159 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "你的電子郵件位址已被認證. 你現在就可以登入, 編輯你的個人檔案而且送出照片!" + +#: mediagoblin/auth/views.py:165 +msgid "The verification key or user id is incorrect" +msgstr "認證碼或是使用者帳號錯誤" + +#: mediagoblin/auth/views.py:186 +#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 +msgid "Resent your verification email." +msgstr "重送認證郵件." + +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "稱謂" + +#: mediagoblin/edit/forms.py:29 +msgid "Slug" +msgstr "自訂字串" + +#: mediagoblin/edit/forms.py:30 +msgid "The slug can't be empty" +msgstr "自訂字串不能空白" + +#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 +msgid "Tags" +msgstr "標籤" + +#: mediagoblin/edit/forms.py:38 +msgid "Bio" +msgstr "自傳" + +#: mediagoblin/edit/forms.py:41 +msgid "Website" +msgstr "網站" + +#: mediagoblin/edit/forms.py:43 +msgid "Improperly formed URL" +msgstr "部正確的網址" + +#: mediagoblin/edit/views.py:54 +msgid "An entry with that slug already exists for this user." +msgstr "這個自訂字串已經被其他人用了" + +#: mediagoblin/edit/views.py:75 +msgid "You are editing another user's media. Proceed with caution." +msgstr "你正在編輯他人的媒體檔案. 請謹慎處理." + +#: mediagoblin/edit/views.py:96 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "你正在編輯他人的檔案. 請謹慎處理." + +#: mediagoblin/submit/forms.py:25 +msgid "File" +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:94 +msgid "Woohoo! Submitted!" +msgstr "喔耶! 送出去了!" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:45 +msgid "Mediagoblin logo" +msgstr "Mediagoblin 標誌" + +#: mediagoblin/templates/mediagoblin/base.html:51 +msgid "Submit media" +msgstr "送出媒體" + +#: mediagoblin/templates/mediagoblin/base.html:62 +msgid "verify your email!" +msgstr "確認您的電子郵件!" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "Login" +msgstr "登入" + +#: mediagoblin/templates/mediagoblin/base.html:88 +msgid "" +"Powered by MediaGoblin, a GNU project" +msgstr "" +"由 MediaGoblin 製作, 她是一個 GNU project" + +#: mediagoblin/templates/mediagoblin/root.html:23 +msgid "Welcome to GNU MediaGoblin!" +msgstr "GNU MediaGoblin 歡迎您!" + +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Submit an item" +msgstr "送出一個項目" + +#: mediagoblin/templates/mediagoblin/root.html:33 +#, python-format +msgid "If you have an account, you can Login." +msgstr "如果您有帳號了, 你可以直接 登入." + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"If you don't have an account, please Register." +msgstr "如果您尚未取得帳號, 請 註冊." + +#: mediagoblin/templates/mediagoblin/auth/login.html:26 +msgid "Log in" +msgstr "登入" + +#: mediagoblin/templates/mediagoblin/auth/login.html:29 +msgid "Login failed!" +msgstr "登入錯誤" + +#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +#: mediagoblin/templates/mediagoblin/submit/start.html:29 +msgid "Submit" +msgstr "送出" + +#: mediagoblin/templates/mediagoblin/auth/login.html:42 +msgid "Don't have an account yet?" +msgstr "還沒有帳號嗎?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:45 +msgid "Create one here!" +msgstr "在這裡建立一個吧!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +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 "" +"嗨 %(username)s,\n" +"\n" +"啟動 GNU MediaGoblin 帳號, 在你的瀏覽器中打開下面的網址:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "編輯 %(media_title)s 中" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +msgid "Cancel" +msgstr "取消" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +msgid "Save changes" +msgstr "儲存變更" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +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:42 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:104 +msgid "atom feed" +msgstr "atom feed" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "送出你的媒體檔案" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#, python-format +msgid "%(username)s's media" +msgstr "%(username)s的媒體" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "抱歉, 找不到這個使用者." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Verification needed" +msgstr "需要驗證" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be verified." +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" +" verified." +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 "%(username)s的個人檔案" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 +msgid "Edit profile" +msgstr "編輯個人檔案" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 +#, python-format +msgid "View all of %(username)s's media" +msgstr "查看%(username)s的全部媒體檔案" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "" + + From 908b20f51c63add1a01f349d45e119ae767a855b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 16 Aug 2011 08:38:36 -0500 Subject: [PATCH 080/134] Pulled down latest translations --- .../i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 5406 -> 5983 bytes .../i18n/fr/LC_MESSAGES/mediagoblin.po | 200 ++++++++++-------- .../i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 5461 -> 5597 bytes .../i18n/sv/LC_MESSAGES/mediagoblin.po | 76 ++++--- 4 files changed, 154 insertions(+), 122 deletions(-) diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo index a7daf2c91cd50bd2dea5da7b64a63ece9b1ac78f..f88547344412fe8a48365c3c9005d92d53b4ac43 100644 GIT binary patch literal 5983 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 H52pSDX2CHIO00{zKu*O=`=9C@SQ+Ch6bD=^| ze6;$|*ds}8)DWwQJcy>mw?@-!q7Nq42aU!DiAEERn#P2h#s~HPu|(>IsWz* zVgiec^79(3VZIOJN-d}X230JK;U1jA?f4S1S6#qzd;_1u_iz^Xamy&agMGM;cjEqH zrFP;7N+1@pMWs>Bbx;DD#|rLO=NOc*u!M5JGN$okyc?T&SciQ`#Of4EU@ks^0k-02 zD4E^FPTX0V51=1+Fds(Qe;lPUX^e5dnq|<4&!bf0ZIlDAphW%)a;CbDlG#nv7%!u& z*oL*(jgr};xF1t^KfaFD_zj-GKaeBTBezq3+3*yD_Y0KDqV#$ z{u4^CYe`E2s6)x92`llyrb8%|dm1J4d6YoTqO|(09n_z*)KwOwq}Nb-{Ux5oA5nVk zuqcuLj1tHow@Itcqg3Qwl#H%y`Uy%PU!WxT1Il|hP%2rhN?`w>^g70A(wgHay?zlp@e)b^U*R3NhH}9=a;GZeb~&dOrPUgx)dLF*S5QiQ4JELzk+anelwOx`tMvL1N{Q!DDz=Cc*g8rp{zlc<9Qwv{ ztgP94sXA7$s*6Trt4pOH6qa-x(8**^_kGcm@%rKpo$TyMc1175s~ScuZ|ZT+8aJV* zd$UY}{N&JN*0MA0<8C&(9RFx_d#tcv;jrU`88fGjxXy&_W%ab>`)6D)rH**HWizKk zNAv!4VCq#r!~YiTal2lPHd!-fu5HE*eI2;rX*cxztsM`l{*)c)Y0sUoGe$k^=-jd_ zG&W~V%C=4hc94nA6%Ca1xsGgYjiU0Fds0RZjvmz`^2(rlDq}mX+6`wsV#zceeQa3! zp&k8I-W82)n>#jU>y68ujX)&$t?OI0-(+X<&!;n1ZY5~dy_QaUX5wH&W3y)_Z9g#H z$#UoyC+u-6AjW91KOFxhI*<5Fw(CFOK>T6}Y3hHvp9w*a<{QXuc, 2011. +# Valentin Villenave , 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-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-10 21:24+0000\n" -"Last-Translator: MarkTraceur \n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" +"PO-Revision-Date: 2011-08-16 13:22+0000\n" +"Last-Translator: joar \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,102 +22,112 @@ msgstr "" #: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:46 msgid "Username" -msgstr "" +msgstr "Nom d'utilisateur" #: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50 msgid "Password" -msgstr "" +msgstr "Mot de passe" #: mediagoblin/auth/forms.py:34 msgid "Passwords must match." -msgstr "" +msgstr "Les mots de passe doivent correspondre." #: mediagoblin/auth/forms.py:36 msgid "Confirm password" -msgstr "" +msgstr "Confirmer le mot de passe" #: mediagoblin/auth/forms.py:39 msgid "Email address" -msgstr "" +msgstr "Adresse e-mail" #: mediagoblin/auth/views.py:40 msgid "Sorry, registration is disabled on this instance." -msgstr "" +msgstr "L'inscription n'est pas activée sur ce serveur, désolé." -#: mediagoblin/auth/views.py:55 +#: mediagoblin/auth/views.py:57 msgid "Sorry, a user with that name already exists." +msgstr "Un utilisateur existe déjà avec ce nom, désolé." + +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." msgstr "" -#: mediagoblin/auth/views.py:152 +#: mediagoblin/auth/views.py:159 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" +"Votre adresse e-mail a bien été vérifiée. Vous pouvez maintenant vous " +"identifier, modifier votre profil, et soumettre des images !" -#: mediagoblin/auth/views.py:158 +#: mediagoblin/auth/views.py:165 msgid "The verification key or user id is incorrect" -msgstr "" +msgstr "La clé de vérification ou le nom d'utilisateur est incorrect." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:186 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 msgid "Resent your verification email." -msgstr "Nous avons renvoyé votre e-mail de vérification." +msgstr "E-mail de vérification renvoyé." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 msgid "Title" -msgstr "" +msgstr "Titre" #: mediagoblin/edit/forms.py:29 msgid "Slug" -msgstr "" +msgstr "Légende" #: mediagoblin/edit/forms.py:30 msgid "The slug can't be empty" -msgstr "" +msgstr "La légende ne peut pas être laissée vide." #: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31 msgid "Tags" -msgstr "" +msgstr "Tags" #: mediagoblin/edit/forms.py:38 msgid "Bio" -msgstr "" +msgstr "Bio" #: mediagoblin/edit/forms.py:41 msgid "Website" -msgstr "" +msgstr "Site web" #: mediagoblin/edit/forms.py:43 msgid "Improperly formed URL" -msgstr "" +msgstr "Adresse web mal formée" #: mediagoblin/edit/views.py:54 msgid "An entry with that slug already exists for this user." -msgstr "" +msgstr "Une entrée existe déjà pour cet utilisateur avec la même légende." #: mediagoblin/edit/views.py:75 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:96 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/submit/forms.py:29 +#: mediagoblin/submit/forms.py:25 msgid "File" -msgstr "" +msgstr "Fichier" -#: mediagoblin/submit/views.py:45 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." -msgstr "" +msgstr "Il vous faut fournir un fichier." -#: mediagoblin/submit/views.py:48 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" -msgstr "" +msgstr "Ce fichier ne semble pas être une image !" -#: mediagoblin/submit/views.py:96 +#: mediagoblin/submit/views.py:94 msgid "Woohoo! Submitted!" -msgstr "" +msgstr "Youhou, c'est envoyé !" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -127,73 +139,74 @@ msgstr "logo de MediaGoblin" #: mediagoblin/templates/mediagoblin/base.html:51 msgid "Submit media" -msgstr "Soumettez des médias" +msgstr "Soumettre un média" #: mediagoblin/templates/mediagoblin/base.html:62 msgid "verify your email!" -msgstr "vérifiez votre addresse e-mail" +msgstr "vérifier son adresse e-mail" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "Login" -msgstr "Connexion" +msgstr "Identification" #: mediagoblin/templates/mediagoblin/base.html:88 msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" -"Alimenté par MediaGoblin, un projet GNU" +"Propulsé par MediaGoblin, un projet " +"de GNU" -#: mediagoblin/templates/mediagoblin/root.html:21 +#: mediagoblin/templates/mediagoblin/root.html:23 msgid "Welcome to GNU MediaGoblin!" -msgstr "Bienvenue à GNU MediaGoblin!" +msgstr "Bienvenue sur GNU MediaGoblin !" -#: mediagoblin/templates/mediagoblin/root.html:26 +#: mediagoblin/templates/mediagoblin/root.html:28 msgid "Submit an item" -msgstr "Soumettez un fichier" +msgstr "Soumettre un fichier" -#: mediagoblin/templates/mediagoblin/root.html:31 +#: mediagoblin/templates/mediagoblin/root.html:33 #, python-format msgid "If you have an account, you can Login." msgstr "" -"Si vous avez un compte, vous pouvez Connecter." +"Si vous avez un compte, vous pouvez vous identifier." -#: mediagoblin/templates/mediagoblin/root.html:37 +#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" "If you don't have an account, please Register." msgstr "" -"Si vous n'avez pas un compte, s'il vous plaît, vous inscrivez." +"Si vous n'avez pas de compte, veuillez vous inscrire." #: mediagoblin/templates/mediagoblin/auth/login.html:26 msgid "Log in" -msgstr "Connexion" +msgstr "S'identifier" #: mediagoblin/templates/mediagoblin/auth/login.html:29 msgid "Login failed!" -msgstr "Connexion manqué" +msgstr "L'identification a échoué !" #: mediagoblin/templates/mediagoblin/auth/login.html:34 #: mediagoblin/templates/mediagoblin/auth/register.html:30 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 -#: mediagoblin/templates/mediagoblin/submit/start.html:32 +#: mediagoblin/templates/mediagoblin/submit/start.html:29 msgid "Submit" -msgstr "Soumettez" +msgstr "Soumettre" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Don't have an account yet?" -msgstr "N'avez-vous toujours un compte?" +msgstr "Pas encore de compte ?" #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Create one here!" -msgstr "En créez un ici!" +msgstr "Créez-en un ici !" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" -msgstr "Créez un compte!" +msgstr "Créer un compte !" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -205,101 +218,112 @@ msgid "" "\n" "%(verification_url)s" msgstr "" -"Bonjour, %(username)s,\n" +"Bonjour %(username)s,\n" "\n" -"pour activer votre compte de GNU MediaGoblin, ouvrez l'URL suite avec votre navigateur web:\n" +"pour activer votre compte sur GNU MediaGoblin, veuillez vous rendre à l'adresse suivante avec votre navigateur web:\n" "\n" "%(verification_url)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "On édit %(media_title)s" +msgstr "Modification de %(media_title)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:36 msgid "Cancel" -msgstr "Annulez" +msgstr "Annuler" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 msgid "Save changes" -msgstr "Enregistrez les modifications" +msgstr "Enregistrer les modifications" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "" +msgstr "Modification du profil de %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:29 +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 msgid "Media tagged with:" -msgstr "" +msgstr "Média comportant les tags suivants :" -#: mediagoblin/templates/mediagoblin/listings/tag.html:40 -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:46 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/listings/tag.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:104 msgid "atom feed" -msgstr "" +msgstr "flux Atom" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" -msgstr "" +msgstr "Soumettez ce média" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Médias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 msgid "Sorry, no such user found." -msgstr "" +msgstr "Impossible de trouver cet utilisateur, désolé." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 msgid "Verification needed" -msgstr "" +msgstr "Vérification requise" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 msgid "Almost done! Your account still needs to be verified." -msgstr "" +msgstr "C'est presque fini ! Il vous faut encore vérifier votre compte." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +#: 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 "" +"Un e-mail devrait vous parvenir dans quelques instants ; il vous indiquera " +"comment procéder." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 msgid "In case it doesn't:" -msgstr "" +msgstr "Si la vérification n'est pas arrivée à bon port :" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 msgid "Resend verification email" -msgstr "" +msgstr "Renvoyer l'e-mail de vérification" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "" "Someone has registered an account with this username, but it still has to be" " verified." msgstr "" +"Quelqu'un a créé un compte à ce nom, mais le compte n'a pas encore été " +"vérifié." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#: 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 "" +"Si c'est de vous qu'il s'agit, mais que vous avez perdu l'e-mail de " +"vérification, vous pouvez vous identifier et " +"le renvoyer." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 #, python-format msgid "%(username)s's profile" -msgstr "" +msgstr "profil de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:84 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 msgid "Edit profile" -msgstr "" +msgstr "Modifier le profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 #, python-format msgid "View all of %(username)s's media" +msgstr "Voir tous les médias de %(username)s" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" msgstr "" diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo index 04fe0b6ffde34b7eabe97b8ea9784f123e96795b..0d4b463c06c1faaaa3a5aa4b0870e2983abf2847 100644 GIT binary patch delta 1195 zcmYMyOGs2<6u|N0IF{yP@{zrKe3%85X)~J7AW;{k6qOQKXxx~aQ#qr|Obd%}5f!>A z5ECK@#Dr>*bSpt9EPHJV!Uo#dE<$J#gssB*AG^>nbAR7==iYP9cfK#NV`1mummKe? z@Y%<&fM1?RXa7GLUXgsJnOK3PxCcA16^Gq<0+X4ir--aVAFjrHT#H4RgB9+)2{(xh zN;`uL{)pguyog0Of|>XTi7m6}!`FBT6F7kFWIKfKu?Y*vx(-ibE}lm%Xb5>lZlK1! zi8G^XM^)Bqnbgx_!@9_G(tJd0ZJFlu3Acnoi28U938CMHe9j}5M2)I#oH z7EWRY`Q-@%E#M_;zI#pd!P7{sat$}*b<~zWz#4px z4fqQ;U?83TcQa^XKn}T&`od#eND_IAdCc$9uX3EhT3p0dEMXZ{7)I^LIO+-?qQ-lQ zTHq||0zV|&v&u|I%qeFCE;cuj7 zsmc~9#75Lkb-VVUuDl=hxuIv)I3wJGlTBnmHWU4+|C0D)I$E?ZY*IRG;up>;!Y%&^q?Nf z3#fa43k{AVwaXmVVFD}B$H~^i-OQy6vpX4RMboH<=7qDE>`O`shwVt*S@It7R`f-q z17#*2vf{=LTW5NW6%0o0Sj>d1n6Y}JwiO&Or))c7;?_Ak;xwl@o>YIO@z>Q?)r>5s zn^b?b@mJOd0?xLKYEN2Q-%4;R>YT`W<25b3Xz%Lpi^Z*#uuSJBq9$qwEsfaY6z0}? F{sOyfl7IjJ delta 1079 zcmYMyOGs2v9LMp$<24^mlR7<*%1BsYpMGvAE83{w7Mh`-$rZyE3 zNJJn}FiqpV)|wW0t}scH%j&KZg8b-*E}fVl~cTEtZ!p_Cpw=A4R`e z-r8xbX5b)h!1K5a?;&$-7?mzxDKiwdL%nPNHAy8Wnt zu3$i; zDT6kMc*Z?YS3ITh{Fq3zeh3idc&qkGG~050CoY bidfohO0~vf#hd;ezT(@!JEu4jO#1!-Hau!s diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 311c5656..23605892 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/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-08-08 22:53-0500\n" -"PO-Revision-Date: 2011-08-09 15:00+0000\n" +"POT-Creation-Date: 2011-08-13 19:47-0500\n" +"PO-Revision-Date: 2011-08-16 13:22+0000\n" "Last-Translator: joar \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -42,11 +42,15 @@ msgstr "E-postadress" msgid "Sorry, registration is disabled on this instance." msgstr "Vi beklagar, registreringen är avtängd på den här instansen." -#: mediagoblin/auth/views.py:55 +#: mediagoblin/auth/views.py:57 msgid "Sorry, a user with that name already exists." msgstr "En användare med det användarnamnet finns redan." -#: mediagoblin/auth/views.py:152 +#: mediagoblin/auth/views.py:61 +msgid "Sorry, that email address has already been taken." +msgstr "Den e-postadressen är redan tagen." + +#: mediagoblin/auth/views.py:159 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -54,16 +58,16 @@ msgstr "" "Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och " "ladda upp filer!" -#: mediagoblin/auth/views.py:158 +#: mediagoblin/auth/views.py:165 msgid "The verification key or user id is incorrect" msgstr "Verifieringsnyckeln eller användar-IDt är fel." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:186 #: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22 msgid "Resent your verification email." msgstr "Skickade ett nytt verifierings-email." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26 +#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" @@ -103,19 +107,19 @@ 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/submit/forms.py:29 +#: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Fil" -#: mediagoblin/submit/views.py:45 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Du måste ange en fil" -#: mediagoblin/submit/views.py:48 +#: 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:96 +#: mediagoblin/submit/views.py:94 msgid "Woohoo! Submitted!" msgstr "Tjohoo! Upladdat!" @@ -147,20 +151,20 @@ msgstr "" "Drivs av MediaGoblin, ett GNU-projekt" -#: mediagoblin/templates/mediagoblin/root.html:21 +#: mediagoblin/templates/mediagoblin/root.html:23 msgid "Welcome to GNU MediaGoblin!" msgstr "Välkommen till GNU MediaGoblin!" -#: mediagoblin/templates/mediagoblin/root.html:26 +#: mediagoblin/templates/mediagoblin/root.html:28 msgid "Submit an item" msgstr "Ladda upp" -#: mediagoblin/templates/mediagoblin/root.html:31 +#: mediagoblin/templates/mediagoblin/root.html:33 #, python-format msgid "If you have an account, you can Login." msgstr "Har du ett konto? Logga in." -#: mediagoblin/templates/mediagoblin/root.html:37 +#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" "If you don't have an account, please %(username)s's media" msgstr "%(username)ss media" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:51 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:30 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 msgid "Sorry, no such user found." msgstr "Finns ingen sådan användare ännu." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:37 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 msgid "Verification needed" msgstr "Verifiering krävs" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:40 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 msgid "Almost done! Your account still needs to be verified." msgstr "Nästan klart! Nu behöver du bara verifiera ditt konto." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:45 +#: 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 "" "Ett e-postmeddelande med instruktioner kommer att hamna hos dig inom kort." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:49 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 msgid "In case it doesn't:" msgstr "Om det inte skulle göra det:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 msgid "Resend verification email" msgstr "Skicka ett nytt e-postmeddelande" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:60 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "" "Someone has registered an account with this username, but it still has to be" " verified." @@ -284,7 +288,7 @@ msgstr "" "Det finns redan ett konto med det här användarnamnet, men det behöver " "verifieras." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:66 +#: 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 logga in och begära ett nytt." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:76 +#: 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:84 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:86 msgid "Edit profile" msgstr "Redigera profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:95 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:98 #, python-format msgid "View all of %(username)s's media" msgstr "Se all media från %(username)s" +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "Kommentar" + From 745961104aabb962fb7dada2ec11f6903cc19abe Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Tue, 16 Aug 2011 23:24:07 +0200 Subject: [PATCH 081/134] Small changes to media.html: changed order of uploader/date and description, added css classes --- .../templates/mediagoblin/user_pages/media.html | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 9c0a1cca..e1175fc4 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -28,16 +28,10 @@ src="{{ request.app.public_store.file_url( media.get_display_media(media.media_files)) }}" />
- -

+

{{media.title}}

- - {% autoescape False %} -

{{ media.description_html }}

- {% endautoescape %} - -

+

{% trans date="%4d-%02d-%02d"|format( media.created.year, media.created.month, media.created.day), @@ -45,11 +39,13 @@ 'mediagoblin.user_pages.user_home', user=media.uploader().username), username=media.uploader().username -%} - — uploaded on {{ date }} by {{ username }} + Uploaded on {{ date }} by {{ username }} {%- endtrans %}

+ {% autoescape False %} +

{{ media.description_html }}

+ {% endautoescape %}
-

{% trans %}Comments{% endtrans %}

{% if request.user %}
{% block mediagoblin_logo %} - {% endblock %} {% if request.user and request.user['status'] == 'active' %} From 9ecf7cd17c339d5f293cf9868c66e54c9e9b5010 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 18 Aug 2011 15:18:54 +0200 Subject: [PATCH 083/134] Whole bunch of changes to base.css --- mediagoblin/static/css/base.css | 42 ++++++++++++++--------------- mediagoblin/static/images/logo.png | Bin 839 -> 0 bytes 2 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 mediagoblin/static/images/logo.png diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 59c2f49d..b15a08d7 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -14,19 +14,9 @@ form { padding: 0px; } -/* Carter One font */ - -@font-face { - font-family: 'Carter One'; - font-style: normal; - font-weight: normal; - src: local('CarterOne'), url('http://themes.googleusercontent.com/font?kit=VjW2qt1pkqVtO22ObxgEBRsxEYwM7FgeyaSgU71cLG0') format('woff'); -} - /* text styles */ h1{ - font-family: 'Carter One',arial,serif; margin-bottom: 15px; margin-top: 15px; color: #fff; @@ -39,12 +29,12 @@ h2{ } h3{ - border-bottom: 1px solid #222; + border-bottom: 1px solid #333; font-size: 18px; } a { - color: #999; + color: #86D4B1; } a.highlight { @@ -66,7 +56,12 @@ label { height: 36px; padding-top: 14px; margin-bottom: 20px; - border-bottom: 1px solid #222222; + border-bottom: 1px solid #333; +} + +a.mediagoblin_logo{ + color:#fff; + font-weight:bold; } .header_submit{ @@ -79,17 +74,16 @@ label { background-image: -o-linear-gradient(top, #D2D2D2, #aaa); background-image: linear-gradient(top, #D2D2D2, #aaa); box-shadow: 0px 0px 4px #000; - border-radius: 5px 5px 5px 5px; + border-radius: 3px; margin: 8px; padding: 3px 8px; text-decoration: none; border: medium none; - font-family: 'Carter One',arial,serif; } .mediagoblin_footer { height: 30px; - border-top: 1px solid #222222; + border-top: 1px solid #333; bottom: 0px; padding-top: 8px; text-align: center; @@ -108,7 +102,6 @@ label { /* common website elements */ .button { - font-family: 'Carter One', arial, serif; height: 32px; min-width: 99px; background-color: #86d4b1; @@ -119,7 +112,7 @@ label { background-image: -o-linear-gradient(top, #86d4b1, #62caa2); background-image: linear-gradient(top, #86d4b1, #62caa2); box-shadow: 0px 0px 4px #000; - border-radius: 5px; + border-radius: 3px; border: none; color: #272727; margin: 10px 0px 10px 15px; @@ -214,10 +207,18 @@ text-align: center; /* media detail */ -.media_image_container { +.media_image_container{ text-align: center; } +h2.media_title{ + margin-bottom:0px; +} + +p.media_uploader{ + font-size:0.9em; +} + /* icons */ img.media_icon{ @@ -232,10 +233,9 @@ img.media_icon{ display: block; float: left; text-align: center; - background-color: #222; + background-color: #333; text-decoration: none; padding: 12px 0pt; - font-family: 'Carter One', arial, serif; font-size: 2em; margin: 0 0 20px } diff --git a/mediagoblin/static/images/logo.png b/mediagoblin/static/images/logo.png deleted file mode 100644 index cf28a6d4118a823c937235335ac6e03cee5f1df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01egv01egwkZ*aM00007bV*G`2ipe- z4L30gxPk5f00PHJL_t(Y$HiB{Zqq;zeKWReJ5ETOmKIcT=Ti`0z?mb0FG1>sKj=^N zAGmVkhCnDuNkd5-+i`Xu2kah!e7>0kFg@a8-YwevJF-ejPABYM* zfQ};~eXVp?Y6ew)|5>Kf=|RJGziu+FhovS(&Oj)G!Q>8%nqD*m|}lHO4FYsWZP(G*oNtNmJ{6 zC?F(VesTbrlI%4^#8tW{TLKxa0CD-b0ss{eXIWWmFC754`jcFJ5fM3T1VZwlfkc~t z>^1#njnqF@ZjYLP_^NvBs_!riZvn}&?ATR?m6QNx045|q-__nlcly2iRN3@`0Q)zJ0SRlduJ0O&d#wz4eyP|c(PfS6<=B5eQ(fOfTNJ*s%M?5^9)I3&k4 zkVlSZdLr_64gG^pXLUrhAtL`pthGxZ`#T<-ztpL@@3=LuR@8U%p>P?9W3me$&ZF=pQBbZRH%edp9| Date: Thu, 18 Aug 2011 15:22:40 +0200 Subject: [PATCH 084/134] Remove space at end of MediaGoblin logo link --- mediagoblin/templates/mediagoblin/base.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 39428897..f46871c6 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -41,8 +41,7 @@ {% block mediagoblin_logo %} + alt="{% trans %}MediaGoblin logo{% endtrans %}" /> {% endblock %} {% if request.user and request.user['status'] == 'active' %} Date: Thu, 18 Aug 2011 15:26:00 +0200 Subject: [PATCH 085/134] No longer center small images --- mediagoblin/static/css/base.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index b15a08d7..1f64eadf 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -207,10 +207,6 @@ text-align: center; /* media detail */ -.media_image_container{ - text-align: center; -} - h2.media_title{ margin-bottom:0px; } From 1f5a55f667bdb497d7baa9a13806f043799d66aa Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 18 Aug 2011 15:53:52 +0200 Subject: [PATCH 086/134] Replace the Feed icon with a transparent one, put it next to the [atom feed] links --- mediagoblin/static/images/icon_feed.png | Bin 522 -> 378 bytes .../templates/mediagoblin/listings/tag.html | 5 +++-- .../templates/mediagoblin/user_pages/user.html | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mediagoblin/static/images/icon_feed.png b/mediagoblin/static/images/icon_feed.png index 11e5b1e76b8e0e6c357a58e8ff018b170b5cec68..81889473b4950247497dca8fe000058c63cffa3c 100644 GIT binary patch delta 305 zcmV-10nYx41o{GyHwgd$0002_L%V;GKp%ey5)CXehjTmR0002`NklDdTs=!kqZIpChM<=xbw6Sk3BM}|Uc#QJW3?-Y_9FhC zu!BtST&Zo6k{<#)PS{oL1)X}CNN&@C)4(2!hE{vfC6dp;`ky*42?oGM@waQhDEw&} z8h~**2!rG|$=?ZkUF6?{oh(Lav56h5sNc)#mnScNJcLxzsp6973ivARy=P40UhUa;zTCHN+Hh)>Z?=zdtFrp|@wrzjo zx-Nx6K_`S^i0irx27_No%y{#)7$BR?((QH`4u`)g(F$s{8u@%4%d)U6i%ce?lWw;g zrBVsQFi=W8DbNJ3tKDwX>2ydW5*mBW^L-zpC{iM#-Mw5cYC4@N5m6$dmdm9+3&T+3 zagF(UvuT=CDi!AQIrVy-X0u5U1OR`eQmHpnHNkj1CI|u^j|TwhbedkThvPUj8V&CE zI{?LEkyfkq$q={jHFmq5mVG*%l!&N)zpt^w;hR07*qoM6N<$f@^KZTmS$7 diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index a43355a7..d047096b 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -38,8 +38,9 @@ {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 4649c8c7..ce6415d7 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -100,8 +100,9 @@

- {%- trans %}atom feed{% endtrans -%} + user=user.username) }}" + >{%- trans %}atom feed{% endtrans -%}
From a97e5bb22c81bf90ab8f49ea1a7edb9a037914fb Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 18 Aug 2011 17:29:38 +0200 Subject: [PATCH 087/134] Fix text sizes (use relative values), remove some unnecessary text sizes, add some spaces here and there --- mediagoblin/static/css/base.css | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 1f64eadf..272a6aee 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -20,7 +20,7 @@ h1{ margin-bottom: 15px; margin-top: 15px; color: #fff; - font-size: 30px; + font-size: 1.875em; } h2{ @@ -30,7 +30,7 @@ h2{ h3{ border-bottom: 1px solid #333; - font-size: 18px; + font-size: 1.125em; } a { @@ -60,8 +60,8 @@ label { } a.mediagoblin_logo{ - color:#fff; - font-weight:bold; + color: #fff; + font-weight: bold; } .header_submit{ @@ -87,7 +87,7 @@ a.mediagoblin_logo{ bottom: 0px; padding-top: 8px; text-align: center; - font-size: 14px; + font-size: 0.8125em; color: #999; } @@ -116,7 +116,6 @@ a.mediagoblin_logo{ border: none; color: #272727; margin: 10px 0px 10px 15px; - font-size: 1em; text-align: center; padding-left: 11px; padding-right: 11px; @@ -137,7 +136,6 @@ text-align: center; background-color: #222; background-image: url("../images/background_lines.png"); background-repeat: repeat-x; - font-size: 18px; padding-bottom: 30px; padding-top: 30px; margin-left: auto; @@ -150,13 +148,8 @@ text-align: center; background-image: url("../images/background_edit.png"); } -.form_box h1 { - font-size: 28px; -} - .form_field_input input, .form_field_input textarea { width: 100%; - font-size: 18px; } .form_field_box { @@ -171,7 +164,6 @@ text-align: center; background-color: #87453b; color: #fff; border: none; - font-size: 16px; padding: 9px; margin-top: 8px; margin-bottom: 8px; @@ -186,7 +178,7 @@ text-align: center; .comment_author { margin-bottom: 40px; padding-top: 4px; - font-size: 14px; + font-size: 0.9em; } .comment_content p { @@ -208,11 +200,11 @@ text-align: center; /* media detail */ h2.media_title{ - margin-bottom:0px; + margin-bottom: 0px; } p.media_uploader{ - font-size:0.9em; + font-size: 0.9em; } /* icons */ From 1d03221d0448903aad17180b0fac0ee73c32204b Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 18 Aug 2011 18:17:53 +0200 Subject: [PATCH 088/134] Added empty_space class for user profile placeholders --- 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 272a6aee..2293ea50 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -79,6 +79,7 @@ a.mediagoblin_logo{ padding: 3px 8px; text-decoration: none; border: medium none; + font-style: normal; } .mediagoblin_footer { @@ -130,6 +131,14 @@ text-align: center; margin: 5px; } +.empty_space{ + background-color: #222; + font-style: italic; + text-align: center; + height: 160px; + padding-top: 70px; +} + /* forms */ .form_box { From 3617ff4acf108bc1d90c6181e51c67dcb4fc44f0 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 19:17:14 -0500 Subject: [PATCH 089/134] From Jef van Schendel: "here's a spot to tell others about yourself" This should display if the user is logged in and they don't have anything in their profile yet. --- .../mediagoblin/user_pages/user.html | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index ce6415d7..f189ed94 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -78,15 +78,29 @@ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%} -
- {% include "mediagoblin/utils/profile.html" %} - {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %} + {% if request.user['_id'] == user['_id'] + and not user['url'] and not user['profile'] %} +
+

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

+ user.username }}" + class="header_submit"> {%- trans %}Edit profile{% endtrans -%} - {% endif %} -
+
+ {% else %} +
+ {% include "mediagoblin/utils/profile.html" %} + {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %} + + {%- trans %}Edit profile{% endtrans -%} + + {% endif %} +
+ {% endif %}
{{ object_gallery(request, media_entries, pagination, From 66a65c9c4c8ef08a7a8ab7935259c749fa7b9d51 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 19:57:24 -0500 Subject: [PATCH 090/134] Switch "atom feed" to "Atom feed" and made the icons and text separate links Before doing the latter there was an ugly underline spanning the icon and the text. --- mediagoblin/templates/mediagoblin/listings/tag.html | 12 +++++++----- .../templates/mediagoblin/user_pages/gallery.html | 13 ++++++++----- .../templates/mediagoblin/user_pages/user.html | 11 +++++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index d047096b..f36f3df4 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -36,11 +36,13 @@
{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index ff935ac4..6acee9ef 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -37,16 +37,19 @@ {%- endtrans %} -
+ {% else %} {# This *should* not occur as the view makes sure we pass in a user. #} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index f189ed94..56f6503c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -113,11 +113,14 @@ View all of {{ username }}'s media{% endtrans -%}

- {%- trans %}atom feed{% endtrans -%} + {% set feed_url = request.urlgen( + 'mediagoblin.user_pages.atom_feed', + user=user.username) %} + + + {%- trans %}Atom feed{% endtrans -%}
From 6890822cce835b132fb9e7bd2f7747de5bcb7716 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 19:57:49 -0500 Subject: [PATCH 091/134] Added an alt tag to the feed icons. Accessibility! Woo! --- mediagoblin/templates/mediagoblin/listings/tag.html | 2 +- mediagoblin/templates/mediagoblin/user_pages/gallery.html | 2 +- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index f36f3df4..bf2b4c01 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -41,7 +41,7 @@ tag=tag_slug) %} + class="media_icon" alt="{% trans %}feed icon{% endtrans %} /> {%- trans %}Atom feed{% endtrans -%}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index 6acee9ef..e54422da 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -47,7 +47,7 @@ user=user.username) %} + class="media_icon" alt="{% trans %}feed icon{% endtrans %}" /> {%- trans %}Atom feed{% endtrans -%} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 56f6503c..1a9a0f83 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -118,7 +118,7 @@ user=user.username) %} + class="media_icon" alt="{% trans %}feed icon{% endtrans %}" /> {%- trans %}Atom feed{% endtrans -%} From 293a7fe4118151ff27153a324d27a554c6c0fc8b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 21:16:50 -0500 Subject: [PATCH 092/134] Give a message if the user hasn't filled in their profile yet. --- .../mediagoblin/user_pages/user.html | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 1a9a0f83..00d25464 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -78,18 +78,27 @@ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%} - {% if request.user['_id'] == user['_id'] - and not user['url'] and not user['profile'] %} -
-

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

- - {%- trans %}Edit profile{% endtrans -%} - -
+ {% if not user['url'] and not user['profile'] %} + {% if request.user['_id'] == user['_id'] %} +
+

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

+ + {%- trans %}Edit profile{% endtrans -%} + +
+ {% else %} +
+

+ {% trans -%} + This user hasn't filled in their profile (yet). + {%- endtrans %} +

+
+ {% endif %} {% else %}
{% include "mediagoblin/utils/profile.html" %} From 0ddea95ea60c2ef61f771c64afb94357d3e005ec Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 21:23:06 -0500 Subject: [PATCH 093/134] More useful messages about when stuff isn't there on a user's homepage. --- .../mediagoblin/user_pages/user.html | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 00d25464..02e6fdc2 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -111,27 +111,50 @@
{% endif %} -
- {{ object_gallery(request, media_entries, pagination, - pagination_base_url=user_gallery_url, col_number=3) }} - {% include "mediagoblin/utils/object_gallery.html" %} -
-

- - {% trans username=user.username -%} - View all of {{ username }}'s media{% endtrans -%} + {% if media_entries.count() %} +

- + {%- trans %}Atom feed{% endtrans -%} +
+ {% else %} + {% if request.user['_id'] == user['_id'] %} +
+

+ {% trans -%} + This is where your media will appear, but you don't seem to have added anything yet. + {%- endtrans %} +

+ + {%- trans %}Add media{% endtrans -%} + +
+ {% else %} +
+

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

+
+ {% endif %} + {% endif %}
{% endif %} {% endblock %} From 5b21ecf9db4c1618066142b77aaa750d1333a1d7 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 21:28:00 -0500 Subject: [PATCH 094/134] Feed link, as an includable template! --- .../templates/mediagoblin/listings/tag.html | 6 +---- .../mediagoblin/user_pages/gallery.html | 6 +---- .../mediagoblin/user_pages/user.html | 6 +---- .../mediagoblin/utils/feed_link.html | 23 +++++++++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 mediagoblin/templates/mediagoblin/utils/feed_link.html diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index bf2b4c01..289f44b8 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -39,10 +39,6 @@ {% set feed_url = request.urlgen( 'mediagoblin.listings.tag_atom_feed', tag=tag_slug) %} - - {% trans %}feed icon{% endtrans %} />
-    </a>
-    <a href={%- trans %}Atom feed{% endtrans -%} + {% include "mediagoblin/utils/feed_link.html" %} {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index e54422da..3a3d2373 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -45,11 +45,7 @@ {% set feed_url = request.urlgen( 'mediagoblin.user_pages.atom_feed', user=user.username) %} - - {% trans %}feed icon{% endtrans %} - - {%- trans %}Atom feed{% endtrans -%} + {% include "mediagoblin/utils/feed_link.html" %} {% else %} {# This *should* not occur as the view makes sure we pass in a user. #} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 02e6fdc2..0214082c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -126,11 +126,7 @@ {% set feed_url = request.urlgen( 'mediagoblin.user_pages.atom_feed', user=user.username) %} - - {% trans %}feed icon{% endtrans %} - - {%- trans %}Atom feed{% endtrans -%} + {% include "mediagoblin/utils/feed_link.html" %} {% else %} {% if request.user['_id'] == user['_id'] %} diff --git a/mediagoblin/templates/mediagoblin/utils/feed_link.html b/mediagoblin/templates/mediagoblin/utils/feed_link.html new file mode 100644 index 00000000..c4036bf3 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/utils/feed_link.html @@ -0,0 +1,23 @@ +{# +# 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 . +#} + + + {% trans %}feed icon{% endtrans %} + +{%- trans %}Atom feed{% endtrans -%} From b5017dbac8ad9e8afd70d2d2281571e0155c3739 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 18 Aug 2011 22:00:55 -0500 Subject: [PATCH 095/134] Switch the grid over to using a... erk... table! :) Also changes the gridification routine a bit. --- mediagoblin/static/css/base.css | 1 - .../mediagoblin/utils/object_gallery.html | 51 +++++++------------ mediagoblin/util.py | 32 ++++++++++++ 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 2293ea50..83f5357c 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -199,7 +199,6 @@ text-align: center; .media_thumbnail { padding: 0px; width: 180px; - height: 180px; overflow: hidden; float: left; margin: 0px 4px 10px 4px; diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index c7286678..b451946d 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -18,44 +18,27 @@ {% from "mediagoblin/utils/pagination.html" import render_pagination %} -{% macro media_grid(request, media_list, col_number=5) %} - {% set num_items = media_list.count() %} - {% set col_counter = 0 %} - {% set row_counter = 0 %} - {% set item_counter = 0 %} - - {% set num_rows = num_items // col_number %} - {% if num_items % col_number != 0 %} - {% set num_rows = num_rows + 1 %} - {% endif %} - - diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index 534e5f20..bed5e0ca 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) }}
- +
From 3d0557bf25683c26ec2b6de041d53fe5a0c6255c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 15:00:25 -0500 Subject: [PATCH 106/134] Change the ordering of the app's __call__ method (attach things to request first) This will make it easier for us to call something like a 404 page rendering method before the matching check is done. --- mediagoblin/app.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index c1ee3d77..96a7ad61 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -101,6 +101,23 @@ class MediaGoblinApp(object): ## Routing / controller loading stuff route_match = self.routing.match(path_info) + ## Attach utilities to the request object + request.matchdict = route_match + request.urlgen = routes.URLGenerator(self.routing, environ) + # Do we really want to load this via middleware? Maybe? + request.session = request.environ['beaker.session'] + # Attach self as request.app + # Also attach a few utilities from request.app for convenience? + request.app = self + request.locale = util.get_locale_from_request(request) + + request.template_env = util.get_jinja_env( + self.template_loader, request.locale) + request.db = self.db + request.staticdirect = self.staticdirector + + util.setup_user_in_request(request) + # No matching page? if route_match is None: # Try to do see if we have a match with a trailing slash @@ -121,23 +138,6 @@ class MediaGoblinApp(object): controller = util.import_component(route_match['controller']) request.start_response = start_response - ## Attach utilities to the request object - request.matchdict = route_match - request.urlgen = routes.URLGenerator(self.routing, environ) - # Do we really want to load this via middleware? Maybe? - request.session = request.environ['beaker.session'] - # Attach self as request.app - # Also attach a few utilities from request.app for convenience? - request.app = self - request.locale = util.get_locale_from_request(request) - - request.template_env = util.get_jinja_env( - self.template_loader, request.locale) - request.db = self.db - request.staticdirect = self.staticdirector - - util.setup_user_in_request(request) - return controller(request)(environ, start_response) From 924e112b8c9ff922b92efe7e63e48968361399fb Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 20 Aug 2011 22:12:44 +0200 Subject: [PATCH 107/134] Feature #494: login vs. log in -- lots of incorrect usage --- mediagoblin/templates/mediagoblin/auth/login.html | 2 +- mediagoblin/templates/mediagoblin/base.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html index 8fe45f2d..afbecf20 100644 --- a/mediagoblin/templates/mediagoblin/auth/login.html +++ b/mediagoblin/templates/mediagoblin/auth/login.html @@ -26,7 +26,7 @@

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

{% if login_failed %}
- {% trans %}Login failed!{% endtrans %} + {% trans %}Logging in failed!{% endtrans %}
{% endif %} {{ wtforms_util.render_divs(login_form) }} diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index f46871c6..e147a34b 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -67,7 +67,7 @@ (
logout) {% else %} - {% trans %}Login{% endtrans %} + {% trans %}Log in{% endtrans %} {% endif %} From 03b058b78e1c27bac3dc61d8bd60801025ec0e7c Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 20 Aug 2011 22:16:48 +0200 Subject: [PATCH 108/134] Missed one thing for Bug #464 --- 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 243b299c..51a855be 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -74,7 +74,7 @@ label { font-weight: normal; } -input { +input, textarea { font-size:1em; font-family:'Lato', sans-serif; } From 2ff37624ff0d19b5b0dd779e2ec1214d928554b7 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 20 Aug 2011 22:24:30 +0200 Subject: [PATCH 109/134] Logout -> log out --- 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 e147a34b..6e54c31d 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -64,7 +64,7 @@ user= request.user['username']) }}"> {{ request.user['username'] }} - (logout) + (log out) {% else %} {% trans %}Log in{% endtrans %} From a7c641d11ed9d161648dbd4472991d5a5d06afd3 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 15:43:58 -0500 Subject: [PATCH 110/134] Allow a user to pass in a status to render_to_response --- mediagoblin/util.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mediagoblin/util.py b/mediagoblin/util.py index cc426228..b588fa72 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -138,9 +138,11 @@ def clear_test_template_context(): TEMPLATE_TEST_CONTEXT = {} -def render_to_response(request, template, context): +def render_to_response(request, template, context, status=200): """Much like Django's shortcut.render()""" - return Response(render_template(request, template, context)) + return Response( + render_template(request, template, context), + status=status) def redirect(request, *args, **kwargs): From bae8f3d8c20b5724abf5ac99776ae582d0a94689 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 15:55:08 -0500 Subject: [PATCH 111/134] Adding and making use of the new 404 error page :) --- mediagoblin/app.py | 2 +- mediagoblin/util.py | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 96a7ad61..1a115a22 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -133,7 +133,7 @@ class MediaGoblinApp(object): return request.get_response(redirect)(environ, start_response) # Okay, no matches. 404 time! - return exc.HTTPNotFound()(environ, start_response) + return util.render_404(request)(environ, start_response) controller = util.import_component(route_match['controller']) request.start_response = start_response diff --git a/mediagoblin/util.py b/mediagoblin/util.py index b588fa72..0b6428da 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -348,8 +348,10 @@ def get_locale_from_request(request): accept_lang_matches = request.accept_language.best_matches() # Your routing can explicitly specify a target language - if request.matchdict.has_key('locale'): - target_lang = request.matchdict['locale'] + matchdict = request.matchdict or {} + + if matchdict.has_key('locale'): + target_lang = matchdict['locale'] elif request.session.has_key('target_lang'): target_lang = request.session['target_lang'] # Pull the first acceptable language @@ -662,3 +664,11 @@ def gridify_cursor(this_cursor, num_cols=5): the number of columns in the list """ return gridify_list(list(this_cursor), num_cols) + + +def render_404(request): + """ + Render a 404. + """ + return render_to_response( + request, 'mediagoblin/404.html', {}, status=400) From 3807e8e29c68a44140044ae7711f229dfef5af51 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 15:55:34 -0500 Subject: [PATCH 112/134] Tacking on an empty matchdict when 404'ing just in case a template expects it --- mediagoblin/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 1a115a22..3030929d 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -133,6 +133,7 @@ class MediaGoblinApp(object): return request.get_response(redirect)(environ, start_response) # Okay, no matches. 404 time! + request.matchdict = {} # in case our template expects it return util.render_404(request)(environ, start_response) controller = util.import_component(route_match['controller']) From de12b4e77358a496bced68cbdc23bf50f95c7ee0 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 15:57:24 -0500 Subject: [PATCH 113/134] Use render_404 EVERYWHERE! --- mediagoblin/auth/views.py | 4 ++-- mediagoblin/decorators.py | 16 ++++++++-------- mediagoblin/user_pages/views.py | 15 ++++++++------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 9120196f..4c4a34fd 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -20,7 +20,7 @@ from webob import exc from mediagoblin import messages from mediagoblin import mg_globals -from mediagoblin.util import render_to_response, redirect +from mediagoblin.util import render_to_response, redirect, render_404 from mediagoblin.util import pass_to_ugettext as _ from mediagoblin.db.util import ObjectId from mediagoblin.auth import lib as auth_lib @@ -144,7 +144,7 @@ def verify_email(request): """ # 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'): - return exc.HTTPNotFound() + return render_404(request) user = request.db.User.find_one( {'_id': ObjectId(unicode(request.GET['userid']))}) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 2e90274e..c66049ca 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -17,7 +17,7 @@ from webob import exc -from mediagoblin.util import redirect +from mediagoblin.util import redirect, render_404 from mediagoblin.db.util import ObjectId, InvalidId @@ -60,9 +60,9 @@ def uses_pagination(controller): try: page = int(request.GET.get('page', 1)) if page < 0: - return exc.HTTPNotFound() + return render_404(request) except ValueError: - return exc.HTTPNotFound() + return render_404(request) return controller(request, page=page, *args, **kwargs) @@ -78,7 +78,7 @@ def get_user_media_entry(controller): {'username': request.matchdict['user']}) if not user: - return exc.HTTPNotFound() + return render_404(request) media = request.db.MediaEntry.find_one( {'slug': request.matchdict['media'], @@ -93,11 +93,11 @@ def get_user_media_entry(controller): 'state': 'processed', 'uploader': user['_id']}) except InvalidId: - return exc.HTTPNotFound() + return render_404(request) # Still no media? Okay, 404. if not media: - return exc.HTTPNotFound() + return render_404(request) return controller(request, media=media, *args, **kwargs) @@ -113,11 +113,11 @@ def get_media_entry_by_id(controller): {'_id': ObjectId(request.matchdict['media']), 'state': 'processed'}) except InvalidId: - return exc.HTTPNotFound() + return render_404(request) # Still no media? Okay, 404. if not media: - return exc.HTTPNotFound() + return render_404(request) return controller(request, media=media, *args, **kwargs) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index d4ff1fce..3677c134 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -19,7 +19,8 @@ from webob import exc from mediagoblin import messages from mediagoblin.db.util import DESCENDING, ObjectId from mediagoblin.util import ( - Pagination, render_to_response, redirect, cleaned_markdown_conversion) + Pagination, render_to_response, redirect, cleaned_markdown_conversion, + render_404) from mediagoblin.user_pages import forms as user_forms from mediagoblin.decorators import (uses_pagination, get_user_media_entry, @@ -34,7 +35,7 @@ def user_home(request, page): user = request.db.User.find_one({ 'username': request.matchdict['user']}) if not user: - return exc.HTTPNotFound() + return render_404(request) elif user['status'] != u'active': return render_to_response( request, @@ -50,7 +51,7 @@ def user_home(request, page): #if no data is available, return NotFound if media_entries == None: - return exc.HTTPNotFound() + return render_404(request) user_gallery_url = request.urlgen( 'mediagoblin.user_pages.user_gallery', @@ -71,7 +72,7 @@ def user_gallery(request, page): 'username': request.matchdict['user'], 'status': 'active'}) if not user: - return exc.HTTPNotFound() + return render_404(request) cursor = request.db.MediaEntry.find( {'uploader': user['_id'], @@ -82,7 +83,7 @@ def user_gallery(request, page): #if no data is available, return NotFound if media_entries == None: - return exc.HTTPNotFound() + return render_404(request) return render_to_response( request, @@ -154,7 +155,7 @@ def atom_feed(request): 'username': request.matchdict['user'], 'status': 'active'}) if not user: - return exc.HTTPNotFound() + return render_404(request) cursor = request.db.MediaEntry.find({ 'uploader': user['_id'], @@ -190,7 +191,7 @@ def processing_panel(request): # Make sure the user exists and is active if not user: - return exc.HTTPNotFound() + return render_404(request) elif user['status'] != u'active': return render_to_response( request, From 9a91a1e7b42e1decb788ca71f5046bb835babe48 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 20 Aug 2011 23:15:00 +0200 Subject: [PATCH 114/134] Add 500.html page --- mediagoblin/templates/mediagoblin/500.html | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 mediagoblin/templates/mediagoblin/500.html diff --git a/mediagoblin/templates/mediagoblin/500.html b/mediagoblin/templates/mediagoblin/500.html new file mode 100644 index 00000000..464630a7 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/500.html @@ -0,0 +1,49 @@ + + + + + + 500 error! GNU MediaGoblin is sorry... + + +

YEOWCH... that's an error!

+

+ .-------------------------.
+ |     __            _     |
+ |    -, \_,------,_//     |
+ |     <\  ,--   --.\      |
+ |      / (  X) (X  )      |
+ |      '  '--, ,--'\      |
+ |     / \ -v-v-u-v /      |
+ |     .  '.__.--__'.\     |
+ |    / ',___/ / \__/'     |
+ |    | |   ,'\_'/, ||     |
+ |    \_|   | | | | ||     |
+ |     W',_ ||| |||_''     |
+ |      |  '------'|       |
+ |      |__|     |_|_      |
+ |     ,,,-'     '-,,,     |
+ '-------------------------'
+

+

Something bad happened, and things broke.

+

If this is not your website, you may want to alert the owner.

+

+

Powered... er broken... by MediaGoblin, a GNU Project.

+ + From a01afc9a7c050d891209931c934385b68eb533d1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 16:34:06 -0500 Subject: [PATCH 115/134] Changing the welcome text based on IRC conversations and marking for translation. --- mediagoblin/templates/mediagoblin/root.html | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 764609b6..08155c17 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -26,21 +26,25 @@

{% trans %}Hi there, media lover! MediaGoblin is...{% endtrans %}

    -
  • The perfect place for your media! No, seriously.
  • -
  • This is just placeholder text though. In the future this will all make sense, trust me.
  • -
  • It might talk about all the awesome features we've got. Or about how great federation is.
  • -
  • Or that it's free software and a GNU project, so anyone can help improve and share it.
  • -
  • No matter what, it's probably good to have a link here. You never know.
  • +
  • {% trans %}The perfect place for your media!{% endtrans %}
  • +
  • {% trans %}A place for people to collaborate and show off original and derived creations!{% endtrans %}
  • +
  • {% trans %}Free, as in freedom. (We’re a GNU project in the making, after all.){% endtrans %}
  • +
  • {% trans %}Aiming to make the world a better place through decentralization and (eventually, coming soon!) federation!{% endtrans %}
  • +
  • {% trans %}Built for extensibility. (Multiple media types coming soon to the software, including video support!){% endtrans %}
  • +
  • {% trans %}Powered by people like you. (You can help us improve this software!){% endtrans %}
+ {% if allow_registration %}

Excited to join us? To add your own media, make collections and save favorites...

Create a free account or Set up MediaGoblin on your own server {% endif %}

+
+
{% endif %}

Most recent media

From 8955ed0c599900aed144f52a1f1a9f6b5cbc018a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 16:34:18 -0500 Subject: [PATCH 116/134] Marking the 404 page for translation --- mediagoblin/templates/mediagoblin/404.html | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/404.html b/mediagoblin/templates/mediagoblin/404.html index 7a86a386..5af46a87 100644 --- a/mediagoblin/templates/mediagoblin/404.html +++ b/mediagoblin/templates/mediagoblin/404.html @@ -19,11 +19,16 @@ {% block mediagoblin_content %}

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

-
-

There doesn't seem to be a page at this address. Sorry!

-

If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.

-
-
- -
+ +
+

{% 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 %} +
{% endblock %} From cd8c65133e493730d9eb4c67f691d100c845a634 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 16:48:29 -0500 Subject: [PATCH 117/134] Removing unused imports --- mediagoblin/gmg_commands/import_export.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index f6651327..83d64313 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -14,22 +14,17 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from mediagoblin.gmg_commands import util as commands_util from mediagoblin import mg_globals -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 import util as mg_util from mediagoblin.storage import BasicFileStorage from mediagoblin.init import setup_storage, setup_global_and_app_config -import shlex import shutil import tarfile import subprocess import os.path import os -import re import sys From c02bea6fb9a87e4cbcb8d77912a92b2226b4eceb Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 21:36:08 -0500 Subject: [PATCH 118/134] Use "with closing(tf)" since TarFile doesn't have .__exit__() --- mediagoblin/gmg_commands/import_export.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 83d64313..fd32136c 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -26,6 +26,7 @@ import subprocess import os.path import os import sys +from contextlib import closing def import_export_parse_setup(subparser): @@ -147,7 +148,7 @@ def _create_archive(args): args.tar_file, mode='w|gz') - with tf: + with closing(tf): tf.add(args.cache_path, 'mediagoblin-data/') print "\n== Archiving done ==\n" From cc601bbd58b76ce6ee1f7b0b1e065fcd3d6ff217 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 21:59:30 -0500 Subject: [PATCH 119/134] Removing some print debugging from import_export --- mediagoblin/gmg_commands/import_export.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index fd32136c..b00fb1cb 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -68,9 +68,6 @@ def _import_media(db, args): media_file.write( media_cache.get_file(path, mode='rb').read()) - print(media_file) - print(entry) - print "\n== Media imported ==\n" @@ -85,8 +82,6 @@ def _import_database(db, args): '-d', db.name, os.path.join(args._cache_path['database'], db.name)]) - print p - p.wait() print "\n== Database imported ==\n" @@ -218,9 +213,6 @@ def _export_media(db, args): mc_file.write( mg_globals.public_store.get_file(path, mode='rb').read()) - print(mc_file) - print(entry) - print "\n== Media exported ==\n" From 00e381f79499b9dc5a456a24f4f012830a4c75c2 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 22:00:21 -0500 Subject: [PATCH 120/134] Apparently we *should* _clean(args), that was commented out for debugging :) --- mediagoblin/gmg_commands/import_export.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index b00fb1cb..46a8269b 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -115,7 +115,8 @@ def env_import(args): _import_media(db, args) - # _clean(args) + _clean(args) + def _setup_paths(args): """ From 6c6009ba65b2df22b27cb6b3d83ee8c220767316 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 22:22:54 -0500 Subject: [PATCH 121/134] Import / export to a temporary directory if cache_path not provided. --- mediagoblin/gmg_commands/import_export.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 46a8269b..812d1486 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -22,6 +22,7 @@ from mediagoblin.init import setup_storage, setup_global_and_app_config import shutil import tarfile +import tempfile import subprocess import os.path import os @@ -43,8 +44,8 @@ def import_export_parse_setup(subparser): '--mongorestore_path', default='mongorestore', help='mongorestore binary') subparser.add_argument( - '--cache_path', default='/tmp/mediagoblin/', - help='') + '--cache_path', + help='Temporary directory where files will be temporarily dumped') def _import_media(db, args): @@ -91,6 +92,9 @@ def env_import(args): """ Restore mongo database and media files from a tar archive """ + if not args.cache_path: + args.cache_path = tempfile.mkdtemp() + # args.cache_path += 'mediagoblin-data' setup_global_and_app_config(args.conf_file) @@ -171,12 +175,6 @@ def _export_check(args): return False - if os.path.exists(args.cache_path): - print 'The cache directory must not exist before you run this script' - print 'Cache directory: ', args.cache_path - - return False - return True @@ -221,6 +219,15 @@ def env_export(args): """ Export database and media files to a tar archive """ + if args.cache_path: + if os.path.exists(args.cache_path): + print 'The cache directory must not exist before you run this script' + print 'Cache directory: ', args.cache_path + + return False + else: + args.cache_path = tempfile.mkdtemp() + args = _setup_paths(args) if not _export_check(args): From 2db2211d96ec200471af675c55ae95c1b5f4ac0d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 20 Aug 2011 22:26:45 -0500 Subject: [PATCH 122/134] We should use os.path.join to concatenate directories. --- mediagoblin/gmg_commands/import_export.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 812d1486..367924a5 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -95,7 +95,6 @@ def env_import(args): if not args.cache_path: args.cache_path = tempfile.mkdtemp() - # args.cache_path += 'mediagoblin-data' setup_global_and_app_config(args.conf_file) # Creates mg_globals.public_store and mg_globals.queue_store @@ -111,7 +110,8 @@ def env_import(args): tf.extractall(args.cache_path) - args.cache_path += 'mediagoblin-data' + args.cache_path = os.path.join( + args.cache_path, 'mediagoblin-data') args = _setup_paths(args) # Import database from extracted data From 72ae87af4a0d5a9e30db220b3ec832721b027769 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 00:09:29 -0500 Subject: [PATCH 123/134] Slightly wrapping paste error middleware and turning it on Now we can show a nice "borked goblin" error :) --- mediagoblin/errormiddleware.py | 53 ++++++++++++++++++++++ mediagoblin/templates/mediagoblin/500.html | 49 -------------------- paste.ini | 12 ++++- setup.py | 3 ++ 4 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 mediagoblin/errormiddleware.py delete mode 100644 mediagoblin/templates/mediagoblin/500.html diff --git a/mediagoblin/errormiddleware.py b/mediagoblin/errormiddleware.py new file mode 100644 index 00000000..084b3684 --- /dev/null +++ b/mediagoblin/errormiddleware.py @@ -0,0 +1,53 @@ +# 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 . + +from paste.exceptions.errormiddleware import make_error_middleware + +MGOBLIN_ERROR_MESSAGE = """\ +
+

YEOWCH... that's an error!

+
+.-------------------------.
+|     __            _     |
+|    -, \_,------,_//     |
+|     <\  ,--   --.\      |
+|      / (  X) (X  )      |
+|      '  '--, ,--'\      |
+|     / \ -v-v-u-v /      |
+|     .  '.__.--__'.\     |
+|    / ',___/ / \__/'     |
+|    | |   ,'\_'/, ||     |
+|    \_|   | | | | ||     |
+|     W',_ ||| |||_''     |
+|      |  '------'|       |
+|      |__|     |_|_      |
+|     ,,,-'     '-,,,     |
+'-------------------------'
+  
+

Something bad happened, and things broke.

+

If this is not your website, you may want to alert the owner.

+

+

+ Powered... er broken... by + MediaGoblin, + a GNU Project. +

+
""" + + +def mgoblin_error_middleware(app, global_conf, **kw): + kw['error_message'] = MGOBLIN_ERROR_MESSAGE + return make_error_middleware(app, global_conf, **kw) diff --git a/mediagoblin/templates/mediagoblin/500.html b/mediagoblin/templates/mediagoblin/500.html deleted file mode 100644 index 464630a7..00000000 --- a/mediagoblin/templates/mediagoblin/500.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - 500 error! GNU MediaGoblin is sorry... - - -

YEOWCH... that's an error!

-

- .-------------------------.
- |     __            _     |
- |    -, \_,------,_//     |
- |     <\  ,--   --.\      |
- |      / (  X) (X  )      |
- |      '  '--, ,--'\      |
- |     / \ -v-v-u-v /      |
- |     .  '.__.--__'.\     |
- |    / ',___/ / \__/'     |
- |    | |   ,'\_'/, ||     |
- |    \_|   | | | | ||     |
- |     W',_ ||| |||_''     |
- |      |  '------'|       |
- |      |__|     |_|_      |
- |     ,,,-'     '-,,,     |
- '-------------------------'
-

-

Something bad happened, and things broke.

-

If this is not your website, you may want to alert the owner.

-

-

Powered... er broken... by MediaGoblin, a GNU Project.

- - diff --git a/paste.ini b/paste.ini index 73fbe8e8..fc459989 100644 --- a/paste.ini +++ b/paste.ini @@ -1,7 +1,11 @@ [DEFAULT] -debug = true +# Set to true to enable web-based debugging messages and etc. +debug = false -[composite:main] +[pipeline:main] +pipeline = errors routing + +[composite:routing] use = egg:Paste#urlmap / = mediagoblin /mgoblin_media/ = publicstore_serve @@ -28,6 +32,10 @@ beaker.session.key = mediagoblin beaker.session.data_dir = %(here)s/user_dev/beaker/sessions/data beaker.session.lock_dir = %(here)s/user_dev/beaker/sessions/lock +[filter:errors] +use = egg:mediagoblin#errors +debug = false + [server:main] use = egg:Paste#http host = 127.0.0.1 diff --git a/setup.py b/setup.py index 40715dd0..d6ef584b 100644 --- a/setup.py +++ b/setup.py @@ -58,6 +58,9 @@ setup( [paste.app_factory] app = mediagoblin.app:paste_app_factory + [paste.filter_app_factory] + errors = mediagoblin.errormiddleware:mgoblin_error_middleware + [zc.buildout] make_user_dev_dirs = mediagoblin.buildout_recipes:MakeUserDevDirs From 9ac7371712c73c7b2e5d0abd2b495959745e8e2f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 00:11:54 -0500 Subject: [PATCH 124/134] Better derp eyes for a 500 error in the ascii art :) --- mediagoblin/errormiddleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/errormiddleware.py b/mediagoblin/errormiddleware.py index 084b3684..2f14fdd5 100644 --- a/mediagoblin/errormiddleware.py +++ b/mediagoblin/errormiddleware.py @@ -24,7 +24,7 @@ MGOBLIN_ERROR_MESSAGE = """\ | __ _ | | -, \_,------,_// | | <\ ,-- --.\ | -| / ( X) (X ) | +| / (x ) ( X ) | | ' '--, ,--'\ | | / \ -v-v-u-v / | | . '.__.--__'.\ | From ae72c6381475408d83bfcf702c8eed7d4d80c1f5 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 00:24:47 -0500 Subject: [PATCH 125/134] Added a docstring to mgoblin_error_middleware --- mediagoblin/errormiddleware.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mediagoblin/errormiddleware.py b/mediagoblin/errormiddleware.py index 2f14fdd5..352dc891 100644 --- a/mediagoblin/errormiddleware.py +++ b/mediagoblin/errormiddleware.py @@ -49,5 +49,12 @@ MGOBLIN_ERROR_MESSAGE = """\ def mgoblin_error_middleware(app, global_conf, **kw): + """ + MediaGoblin wrapped error middleware. + + This is really just wrapping the error middleware from Paste. + It should take all of Paste's default options, so see: + http://pythonpaste.org/modules/exceptions.html + """ kw['error_message'] = MGOBLIN_ERROR_MESSAGE return make_error_middleware(app, global_conf, **kw) From 63c9a0c766559ddd9bea79a03499040a0f3f9853 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 15:14:45 -0500 Subject: [PATCH 126/134] Updating tests for new storage config code --- mediagoblin/tests/test_mgoblin_app.ini | 10 +++++++--- mediagoblin/tests/test_storage.py | 21 +++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini index 7716e9ca..0109d751 100644 --- a/mediagoblin/tests/test_mgoblin_app.ini +++ b/mediagoblin/tests/test_mgoblin_app.ini @@ -1,7 +1,4 @@ [mediagoblin] -queuestore_base_dir = %(here)s/test_user_dev/media/queue -publicstore_base_dir = %(here)s/test_user_dev/media/public -publicstore_base_url = /mgoblin_media/ direct_remote_path = /mgoblin_static/ email_sender_address = "notice@mediagoblin.example.org" email_debug_mode = true @@ -15,5 +12,12 @@ tags_max_length = 50 # mediagoblin.init.celery.from_celery celery_setup_elsewhere = true +[storage:publicstore] +base_dir = %(here)s/test_user_dev/media/public +base_url = /mgoblin_media/ + +[storage:queuestore] +queuestore_base_dir = %(here)s/test_user_dev/media/queue + [celery] celery_always_eager = true diff --git a/mediagoblin/tests/test_storage.py b/mediagoblin/tests/test_storage.py index 1800c29d..45cb35c1 100644 --- a/mediagoblin/tests/test_storage.py +++ b/mediagoblin/tests/test_storage.py @@ -60,23 +60,20 @@ class FakeRemoteStorage(storage.BasicFileStorage): def test_storage_system_from_config(): this_storage = storage.storage_system_from_config( - {'somestorage_base_url': 'http://example.org/moodia/', - 'somestorage_base_dir': '/tmp/', - 'somestorage_garbage_arg': 'garbage_arg', - 'garbage_arg': 'trash'}, - 'somestorage') + {'base_url': 'http://example.org/moodia/', + 'base_dir': '/tmp/', + 'garbage_arg': 'garbage_arg', + 'garbage_arg': 'trash'}) assert this_storage.base_url == 'http://example.org/moodia/' assert this_storage.base_dir == '/tmp/' assert this_storage.__class__ is storage.BasicFileStorage this_storage = storage.storage_system_from_config( - {'somestorage_foobie': 'eiboof', - 'somestorage_blech': 'hcelb', - 'somestorage_garbage_arg': 'garbage_arg', - 'garbage_arg': 'trash', - 'somestorage_storage_class': - 'mediagoblin.tests.test_storage:FakeStorageSystem'}, - 'somestorage') + {'foobie': 'eiboof', + 'blech': 'hcelb', + 'garbage_arg': 'garbage_arg', + 'storage_class': + 'mediagoblin.tests.test_storage:FakeStorageSystem'}) assert this_storage.foobie == 'eiboof' assert this_storage.blech == 'hcelb' assert this_storage.__class__ is FakeStorageSystem From abbc6c1a550d3aa8bab11fc67561e134d65ac5e6 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 21:54:54 -0500 Subject: [PATCH 127/134] Updating the mediagoblin manual's foreward: - Removing contributors section of the foreward... we should have a contributors list, but it doesn't belong here. - Specifying that this manual is not contributor-oriented... it's for local users/administrators - Updating issue tracker link - Adjusting the "living document" line to mention http://docs.mediagoblin.org --- docs/source/foreword.rst | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/docs/source/foreword.rst b/docs/source/foreword.rst index 1d423f08..4fd96842 100644 --- a/docs/source/foreword.rst +++ b/docs/source/foreword.rst @@ -8,34 +8,27 @@ About this manual This is the GNU MediaGoblin manual. This documentation targets the following groups of individuals: -* people who want to use the software -* people who want to deploy the software -* contributors +* people who want to try the software locally +* people who want to deploy and administrate the software -This manual is a living document and is in the ``mediagoblin`` +This manual doesn't cover contributors to the codebase. But we want +and love contributors! To join as a contributor please visit the +following pages instead: + +* http://mediagoblin.org/pages/join.html for general "join us" information +* http://wiki.mediagoblin.org/ for our contributor-focused wiki + +If you are viewing this from http://docs.mediagoblin.org be aware that +this manual is a living document and is in the ``mediagoblin`` repository in the ``docs/`` directory. -Who wrote this documentation? -============================= - -In no particular order: - -* Chris -* Will -* Deb -* Greg -* Karen -* Matt -* Asheesh - - I found an error in the docs---who do I tell? ============================================= There are a few ways---please pick the one most convenient to you! -1. Write up a bug report in the bug tracker at http://bugs.foocorp.net/ . +1. Write up a bug report in the bug tracker at http://bugs.foocorp.net/projects/mediagoblin/issues 2. Tell someone on IRC ``#mediagoblin`` on Freenode. 3. Send an email to Will ``willg at bluesock dot org``. From 26924b717efe7942593c992999a792de36dc82f4 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 22:23:03 -0500 Subject: [PATCH 128/134] Changing the MediaGoblin Sphinx docs a bit... - Removing the git guide, and moved it to the wiki - moving mediagoblin.rst to about_mediagoblin.rst --- ...{mediagoblin.rst => about_mediagoblin.rst} | 0 docs/source/git.rst | 224 ------------------ docs/source/index.rst | 5 +- 3 files changed, 2 insertions(+), 227 deletions(-) rename docs/source/{mediagoblin.rst => about_mediagoblin.rst} (100%) delete mode 100644 docs/source/git.rst diff --git a/docs/source/mediagoblin.rst b/docs/source/about_mediagoblin.rst similarity index 100% rename from docs/source/mediagoblin.rst rename to docs/source/about_mediagoblin.rst diff --git a/docs/source/git.rst b/docs/source/git.rst deleted file mode 100644 index ab3206b6..00000000 --- a/docs/source/git.rst +++ /dev/null @@ -1,224 +0,0 @@ -========================== - Git, Cloning and Patches -========================== - -.. contents:: Sections - :local: - - -GNU MediaGoblin uses git for all our version control and we have the -repositories hosted on `Gitorious `_. We have -two repositories: - -* MediaGoblin software: http://gitorious.org/mediagoblin/mediagoblin -* MediaGoblin website: http://gitorious.org/mediagoblin/mediagoblin-website - -It's most likely you want to look at the software repository--not the -website one. - -The rest of this chapter talks about using the software repository. - - -How to clone the project -======================== - -Do:: - - git clone git://gitorious.org/mediagoblin/mediagoblin.git - - -How to contribute changes -========================= - -Tie your changes to issues in the issue tracker ------------------------------------------------ - -All patches should be tied to issues in the `issue tracker -`_. That makes -it a lot easier for everyone to track proposed changes and make sure -your hard work doesn't get dropped on the floor! If there isn't an -issue for what you're working on, please create one. The better the -description of what it is you're trying to fix/implement, the better -everyone else is able to understand why you're doing what you're -doing. - - -Use bugfix branches to make changes ------------------------------------ - -The best way to isolate your changes is to create a branch based off -of the MediaGoblin repository master branch, do the changes related to -that one issue there, and then let us know how to get it. - -It's much easier on us if you isolate your changes to a branch focused -on the issue. Then we don't have to sift through things. - -It's much easier on you if you isolate your changes to a branch -focused on the issue. Then when we merge your changes in, you just -have to do a ``git fetch`` and that's it. This is especially true if -we reject some of your changes, but accept others or otherwise tweak -your changes. - -Further, if you isolate your changes to a branch, then you can work on -multiple issues at the same time and they don't conflict with one -another. - -Name your branches using the isue number and something that makes it clear -what it's about. For example, if you were working on tagging, you -might name your branch ``360_tagging``. - - -Properly document your changes ------------------------------- - -Include comments in the code. - -Write comprehensive commit messages. The better your commit message -is at describing what you did and why, the easier it is for us to -quickly accept your patch. - -Write comprehensive comments in the issue tracker about what you're -doing and why. - - -How to send us your changes ---------------------------- - -There are two ways to let us know how to get it: - -1. *(preferred)* **push changes to publicly available git clone and - let us know where to find it** - - Push your feature/bugfix/issue branch to your publicly available - git clone and add a comment to the issue with the url for your - clone and the branch to look at. - -2. **attaching the patch files to the issue** - - Run:: - - git format-patch --stdout /master > issue_.patch - - ``format-patch`` creates a patch of all the commits that are in - your branch that aren't in ``/master``. The ``--stdout`` - flag causes all this output to go to stdout where it's redirected - to a file named ``issue_.patch``. That file should be - based on the issue you're working with. For example, - ``issue_42.patch`` is a good filename and ``issue_42_rev2.patch`` - is good if you did a revision of it. - - Having said all that, the filename isn't wildly important. - - -Example workflow -================ - -Here's an example workflow. - - -Contributing changes --------------------- - -Slartibartfast from the planet Magrathea far off in the universe has -decided that he is bored with fjords and wants to fix issue 42 (the -meaning of life bug) and send us the changes. - -Slartibartfast has cloned the MediaGoblin repository and his clone -lives on gitorious. - -Slartibartfast works locally. The remote named ``origin`` points to -his clone on gitorious. The remote named ``gmg`` points to the -MediaGoblin repository. - -Slartibartfast does the following: - -1. Fetches the latest from the MediaGoblin repository:: - - git fetch --all -p - - This tells ``git fetch`` to fetch all the recent data from all of - the remotes (``--all``) and prune any branches that have been - deleted in the remotes (``-p``). - -2. Creates a branch from the tip of the MediaGoblin repository (the - remote is named ``gmg``) master branch called ``bug42_meaning_of_life``:: - - git checkout -b bug42_meaning_of_life gmg/master - - This creates a new branch (``-b``) named ``bug42_meaning_of_life`` based - on the tip of the ``master`` branch of the remote named ``gmg`` and checks - it out. - -3. Slartibartfast works hard on his changes in the ``bug42_meaning_of_life`` - branch. When done, he wants to notify us that he has made changes - he wants us to see. - -4. Slartibartfast pushes his changes to his clone:: - - git push origin bug42_meaning_of_life --set-upstream - - This pushes the changes in the ``bug42_meaning_of_life`` branch to the - remote named ``origin``. - -5. Slartibartfast adds a comment to issue 42 with the url for his - repository and the name of the branch he put the code in. He also - explains what he did and why it addresses the issue. - - -Updating a contribution ------------------------ - -Slartibartfast brushes his hands off with the sense of accomplishment -that comes with the knowledge of a job well done. He stands, wanders -over to get a cup of water, then realizes that he forgot to run the -unit tests! - -He runs the unit tests and discovers there's a bug in the code! - -Then he does this: - -1. He checks out the ``bug42_meaning_of_life`` branch:: - - git checkout bug42_meaning_of_life - -2. He fixes the bug and checks it into the ``bug42_meaning_of_life`` branch. - -3. He pushes his changes to his clone (the remote is named ``origin``):: - - git push origin bug42_meaning_of_life - -4. He adds another comment to issue 42 explaining about the mistake - and how he fixed it and that he's pushed the new change to the - ``bug42_meaning_of_life`` branch of his publicly available clone. - - -What happens next ------------------ - -Slartibartfast is once again happy with his work. He finds issue 42 -in the issue tracker and adds a comment saying he submitted a merge -request with his changes and explains what they are. - -Later, someone checks out his code and finds a problem with it. He -adds a comment to the issue tracker specifying the problem and asks -Slartibartfast to fix it. Slartibartfst goes through the above steps -again, fixes the issue, pushes it to his ``bug42_meaning_of_life`` branch and adds -another comment to the issue tracker about how he fixed it. - -Later, someone checks out his code and is happy with it. Someone -pulls it into the master branch of the MediaGoblin repository and adds -another comment to the issue and probably closes the issue out. - -Slartibartfast is notified of this. Slartibartfast does a:: - - git fetch --all - -The changes show up in the ``master`` branch of the ``gmg`` remote. -Slartibartfast now deletes his ``bug42_meaning_of_life`` branch -because he doesn't need it anymore. - - -How to learn git -================ - -Check out `the wiki `_. diff --git a/docs/source/index.rst b/docs/source/index.rst index 8c00869a..79f2653e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,11 +12,10 @@ Table of Contents: :maxdepth: 2 foreword - mediagoblin - contributinghowto + about_mediagoblin deploymenthowto theminghowto - git + contributinghowto codebase vision From 7a8ad8187c22f96604fda3a9a63f2b0e70d3aca0 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 23:02:21 -0500 Subject: [PATCH 129/134] MediaGoblin favicon by Alex Camelio!!! OMG. --- mediagoblin/static/images/goblin.ico | Bin 0 -> 318 bytes mediagoblin/static/images/goblin.png | Bin 0 -> 413 bytes mediagoblin/templates/mediagoblin/base.html | 2 ++ 3 files changed, 2 insertions(+) create mode 100644 mediagoblin/static/images/goblin.ico create mode 100644 mediagoblin/static/images/goblin.png diff --git a/mediagoblin/static/images/goblin.ico b/mediagoblin/static/images/goblin.ico new file mode 100644 index 0000000000000000000000000000000000000000..f2e7152f9e6a932d5fe79c91bb419b955c86ed5b GIT binary patch literal 318 zcmaKnu?oU45QhJ#=x8Fr!9i=rgy7={4!(w)tD{@JpoLET z!k4>TavT8|EzUXZBg71t1BgjZ2Bfd|u@MVwmpdHyHLmuA`}u;VY5H0^cT5OBh)H8K zB{H|R&|s#loHLvmK~U6|keuaJ>8gT59!fXX^xmI+G=%TVl!^?OS(v6tq{S>H)&fvU jCI7Ku@Jj{(J}clk0d7N}roVUfwN_tmc~61nLB4=50(vM= literal 0 HcmV?d00001 diff --git a/mediagoblin/static/images/goblin.png b/mediagoblin/static/images/goblin.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3ad22ee0e01e814802e064de8955ad97d1c39e GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)4lzbv?U(;wd;yvw>*?YcVsW~6 z@>)M;N0HY3nHxH8wM_^K(fN8o;K?ex1A7=JDBM^ekipU=;^pr zNF)ot0mqKRe{we;fAi#x?ellGr&cju#7hb2iaWouXK6}Z*fA?0} zPXEj~KYr_`&n;@N6_OfyKRhk1%sIdPIX}ak7}$KkMoIkeu z&APx%93Ovu6Iy$*JFF>l7yr{5ri7y>=btp?ddS6UAAGzZeAcYXDZsE}@O1TaS?83{ F1OUjFs-*w` literal 0 HcmV?d00001 diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 6e54c31d..91b434c1 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -28,6 +28,8 @@ href="{{ request.staticdirect('/css/extlib/960_16_col.css') }}"/> + {% block mediagoblin_head %} {% endblock mediagoblin_head %} From ec451724ccd436f758fabb67e1e872f002acf4d5 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 23:10:12 -0500 Subject: [PATCH 130/134] Add titles to media entries in galleries --- mediagoblin/static/css/base.css | 5 +++++ .../templates/mediagoblin/utils/object_gallery.html | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 51a855be..af8f7763 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -244,6 +244,11 @@ text-align: center; text-align: center; } +.media_thumbnail a { + color: #eee; + text-decoration: none; +} + /* media detail */ h2.media_title{ diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index b451946d..34eb7dbc 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -25,13 +25,18 @@ {%- if loop.first %} thumb_row_first {%- elif loop.last %} thumb_row_last{% endif %}"> {% for entry in row %} + {% set entry_url = entry.url_for_self(request.urlgen) %} - + + {% if entry['title'] %} +
+ {{ entry['title'] }} + {% endif %} {% endfor %} From 970cea18dcdbfd68ad5506843504decd6826122b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 23:39:35 -0500 Subject: [PATCH 131/134] I think the media entries' titles look nicer if they're a bit smaller. --- 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 af8f7763..1852b70c 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -242,6 +242,7 @@ text-align: center; float: left; margin: 0px 4px 10px 4px; text-align: center; + font-size: 0.875em; } .media_thumbnail a { From 9b424b17ccb6b6c034755925b14f9cfda23ad29a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 21 Aug 2011 23:39:59 -0500 Subject: [PATCH 132/134] Feature #506: link to original sized image if we scaled the image down. --- .../mediagoblin/user_pages/media.html | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 2086d3d6..6747fddc 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -24,9 +24,24 @@ {% 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') %} + + Image for {{ media.title }} + + {% else %} + Image for {{ media.title }} + {% endif %}

From a8327519ebcb9ea7b3b8362cda989a130a5813d1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 22 Aug 2011 00:33:33 -0500 Subject: [PATCH 133/134] Experimentally putting logo in place Combining MediaGoblin eared-M logo with Thorsten's handwritten text. Well... looking nice to me :) --- mediagoblin/static/images/logo.png | Bin 0 -> 3340 bytes mediagoblin/templates/mediagoblin/base.html | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 mediagoblin/static/images/logo.png diff --git a/mediagoblin/static/images/logo.png b/mediagoblin/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..019ec5ec877b08fa7789f82f1cef57460bfc8807 GIT binary patch literal 3340 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 WOoTEok7gJE0000 {% block mediagoblin_logo %} + {% trans %}MediaGoblin logo{% endtrans %} + {% endblock %} {% if request.user and request.user['status'] == 'active' %} Date: Mon, 22 Aug 2011 08:01:20 -0500 Subject: [PATCH 134/134] Removing any chance of spaces in the logo link --- mediagoblin/templates/mediagoblin/base.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 370ec6ef..32d5a5d2 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -41,10 +41,10 @@
{% block mediagoblin_logo %} - + {% endblock %} {% if request.user and request.user['status'] == 'active' %}