aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.tx/config8
-rw-r--r--babel.ini2
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin0 -> 602 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po25
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po197
-rw-r--r--mediagoblin/process_media/__init__.py13
-rw-r--r--mediagoblin/storage.py86
-rw-r--r--mediagoblin/templates/mediagoblin/auth/login.html15
-rw-r--r--mediagoblin/templates/mediagoblin/auth/register.html5
-rw-r--r--mediagoblin/templates/mediagoblin/auth/resent_verification_email.html2
-rw-r--r--mediagoblin/templates/mediagoblin/auth/verification_email.txt10
-rw-r--r--mediagoblin/templates/mediagoblin/base.html14
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit.html6
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_profile.html8
-rw-r--r--mediagoblin/templates/mediagoblin/listings/tag.html6
-rw-r--r--mediagoblin/templates/mediagoblin/root.html14
-rw-r--r--mediagoblin/templates/mediagoblin/submit/start.html4
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/gallery.html18
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html31
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html55
-rw-r--r--mediagoblin/templates/mediagoblin/utils/tags.html2
-rw-r--r--mediagoblin/util.py2
-rw-r--r--setup.py2
24 files changed, 440 insertions, 88 deletions
diff --git a/.gitignore b/.gitignore
index f5c2ba31..9da56bab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,8 @@ mediagoblin.egg-info
*.pyo
docs/_build/
user_dev/
-mediagoblin_user.ini
+paste_local.ini
+mediagoblin_local.ini
server-log.txt
*~
*.swp
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 00000000..711b5d94
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,8 @@
+[mediagoblin.mediagoblin]
+file_filter = mediagoblin/i18n/<lang>/LC_MESSAGES/mediagoblin.po
+source_file = mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+source_lang = en
+
+[main]
+host = https://www.transifex.net
+
diff --git a/babel.ini b/babel.ini
index 666270df..a4e3267a 100644
--- a/babel.ini
+++ b/babel.ini
@@ -10,4 +10,4 @@ encoding = utf-8
# # Extraction from JavaScript files
# [javascript: mediagoblin/static/js/**.js]
-# extract_messages = $._, jQuery._ \ No newline at end of file
+# extract_messages = $._, jQuery._
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..ba625623
--- /dev/null
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..715757fb
--- /dev/null
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,25 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# <cwebber@dustycloud.org>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-06 23:01-0500\n"
+"PO-Revision-Date: 2011-08-07 14:06+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: mediagoblin/templates/mediagoblin/root.html:21
+msgid "Welcome to GNU MediaGoblin!"
+msgstr "Willkommen bei GNU MediaGoblin!"
+
+
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..5e54390d
--- /dev/null
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,197 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+#, fuzzy
+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"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: 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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+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 <a href=\"%(login_url)s\">Login</a>."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:37
+#, python-format
+msgid ""
+"If you don't have an account, please <a "
+"href=\"%(register_url)s\">Register</a>."
+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 "<a href=\"%(user_url)s\">%(username)s</a>'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 "
+"<a href=\"%(login_url)s\">log in</a> 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/process_media/__init__.py b/mediagoblin/process_media/__init__.py
index 125b24e0..8e12ca4d 100644
--- a/mediagoblin/process_media/__init__.py
+++ b/mediagoblin/process_media/__init__.py
@@ -19,6 +19,7 @@ from mediagoblin.db.util import ObjectId
from celery.task import task
from mediagoblin import mg_globals as mgg
+from contextlib import contextmanager
THUMB_SIZE = 180, 180
@@ -31,6 +32,12 @@ def create_pub_filepath(entry, filename):
unicode(entry['_id']),
filename])
+@contextmanager
+def closing(callback):
+ try:
+ yield callback
+ finally:
+ pass
@task
def process_media_initial(media_id):
@@ -53,7 +60,7 @@ def process_media_initial(media_id):
thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg')
thumb_file = mgg.public_store.get_file(thumb_filepath, 'w')
- with thumb_file:
+ with closing(thumb_file):
thumb.save(thumb_file, "JPEG", quality=90)
"""
@@ -73,7 +80,7 @@ def process_media_initial(media_id):
medium_filepath = create_pub_filepath(entry, 'medium.jpg')
medium_file = mgg.public_store.get_file(medium_filepath, 'w')
- with medium_file:
+ with closing(medium_file):
medium.save(medium_file, "JPEG", quality=90)
medium_processed = True
@@ -84,7 +91,7 @@ def process_media_initial(media_id):
with queued_file:
original_filepath = create_pub_filepath(entry, queued_filepath[-1])
- with mgg.public_store.get_file(original_filepath, 'wb') as original_file:
+ with closing(mgg.public_store.get_file(original_filepath, 'wb')) as original_file:
original_file.write(queued_file.read())
mgg.queue_store.delete_file(queued_filepath)
diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py
index f9d2c3ea..25598c82 100644
--- a/mediagoblin/storage.py
+++ b/mediagoblin/storage.py
@@ -19,6 +19,7 @@ import re
import shutil
import urlparse
import uuid
+import cloudfiles
from werkzeug.utils import secure_filename
@@ -28,11 +29,21 @@ from mediagoblin import util
# Errors
########
-class Error(Exception): pass
-class InvalidFilepath(Error): pass
-class NoWebServing(Error): pass
-class NotImplementedError(Error): pass
+class Error(Exception):
+ pass
+
+
+class InvalidFilepath(Error):
+ pass
+
+
+class NoWebServing(Error):
+ pass
+
+
+class NotImplementedError(Error):
+ pass
###############################################
@@ -117,7 +128,7 @@ class StorageInterface(object):
Eg, if the filename doesn't exist:
>>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
[u'dir1', u'dir2', u'fname.jpg']
-
+
But if a file does exist, let's get one back with at uuid tacked on:
>>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
[u'dir1', u'dir2', u'd02c3571-dd62-4479-9d62-9e3012dada29-fname.jpg']
@@ -184,7 +195,7 @@ class BasicFileStorage(StorageInterface):
"""
return os.path.join(
self.base_dir, *clean_listy_filepath(filepath))
-
+
def file_exists(self, filepath):
return os.path.exists(self._resolve_filepath(filepath))
@@ -216,6 +227,65 @@ class BasicFileStorage(StorageInterface):
return self._resolve_filepath(filepath)
+class CloudFilesStorage(StorageInterface):
+ def __init__(self, **kwargs):
+ self.param_container = kwargs.get('cloudfiles_container')
+ self.param_user = kwargs.get('cloudfiles_user')
+ self.param_api_key = kwargs.get('cloudfiles_api_key')
+ self.param_host = kwargs.get('cloudfiles_host')
+ self.param_use_servicenet = kwargs.get('cloudfiles_use_servicenet')
+
+ if not self.param_host:
+ print('No CloudFiles host URL specified, '
+ 'defaulting to Rackspace US')
+
+ self.connection = cloudfiles.get_connection(
+ username=self.param_user,
+ api_key=self.param_api_key,
+ servicenet=True if self.param_use_servicenet == 'true' or \
+ self.param_use_servicenet == True else False)
+
+ if not self.param_container == \
+ self.connection.get_container(self.param_container):
+ self.container = self.connection.create_container(
+ self.param_container)
+ self.container.make_public(
+ ttl=60 * 60 * 2)
+ else:
+ self.container = self.connection.get_container(
+ self.param_container)
+
+ def _resolve_filepath(self, filepath):
+ return '/'.join(
+ clean_listy_filepath(filepath))
+
+ def file_exists(self, filepath):
+ try:
+ object = self.container.get_object(
+ self._resolve_filepath(filepath))
+ return True
+ except cloudfiles.errors.NoSuchObject:
+ return False
+
+ def get_file(self, filepath, mode='r'):
+ try:
+ obj = self.container.get_object(
+ self._resolve_filepath(filepath))
+ except cloudfiles.errors.NoSuchObject:
+ obj = self.container.create_object(
+ self._resolve_filepath(filepath))
+
+ return obj
+
+ def delete_file(self, filepath):
+ # TODO: Also delete unused directories if empty (safely, with
+ # checks to avoid race conditions).
+ self.container.delete_object(filepath)
+
+ def file_url(self, filepath):
+ return self.get_file(filepath).public_uri()
+
+
class MountStorage(StorageInterface):
def __init__(self, **kwargs):
self.mounttab = {}
@@ -391,7 +461,7 @@ def storage_system_from_config(paste_config, storage_prefix):
for key, value in paste_config.iteritems()
if prefix_re.match(key)])
- if config_params.has_key('storage_class'):
+ if 'storage_class' in config_params:
storage_class = config_params['storage_class']
config_params.pop('storage_class')
else:
@@ -399,5 +469,3 @@ def storage_system_from_config(paste_config, storage_prefix):
storage_class = util.import_component(storage_class)
return storage_class(**config_params)
-
-
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html
index e25783ea..5750feb0 100644
--- a/mediagoblin/templates/mediagoblin/auth/login.html
+++ b/mediagoblin/templates/mediagoblin/auth/login.html
@@ -23,20 +23,27 @@
<form action="{{ request.urlgen('mediagoblin.auth.login') }}"
method="POST" enctype="multipart/form-data">
<div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>Log in</h1>
+ <h1>{% trans %}Log in{% endtrans %}</h1>
{% if login_failed %}
- <div class="form_field_error">Login failed!</div>
+ <div class="form_field_error">
+ {% trans %}Login failed!{% endtrans %}
+ </div>
{% endif %}
{{ wtforms_util.render_divs(login_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button"/>
+ <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button"/>
</div>
{% if next %}
<input type="hidden" name="next" value="{{ next }}" class="button"
style="display: none;"/>
{% endif %}
{% if allow_registration %}
- <p>Don't have an account yet?<br /><a href="{{ request.urlgen('mediagoblin.auth.register') }}">Create one here!</a></p>
+ <p>
+ {% trans %}Don't have an account yet?{% endtrans %}
+ <br />
+ <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
+ {%- trans %}Create one here!{% endtrans %}</a>
+ </p>
{% endif %}
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html
index f77b3782..623cbdfd 100644
--- a/mediagoblin/templates/mediagoblin/auth/register.html
+++ b/mediagoblin/templates/mediagoblin/auth/register.html
@@ -24,10 +24,11 @@
<form action="{{ request.urlgen('mediagoblin.auth.register') }}"
method="POST" enctype="multipart/form-data">
<div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>Create an account!</h1>
+ <h1>{% trans %}Create an account!{% endtrans %}</h1>
{{ wtforms_util.render_divs(register_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button" />
+ <input type="submit" value="{% trans %}Submit{% endtrans %}"
+ class="button" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html b/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html
index da3a9e99..8fd80ee9 100644
--- a/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html
+++ b/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html
@@ -19,6 +19,6 @@
{% block mediagoblin_content %}
<p>
- Resent your verification email.
+ {% trans %}Resent your verification email.{% endtrans %}
</p>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/verification_email.txt b/mediagoblin/templates/mediagoblin/auth/verification_email.txt
index 7863374d..32053101 100644
--- a/mediagoblin/templates/mediagoblin/auth/verification_email.txt
+++ b/mediagoblin/templates/mediagoblin/auth/verification_email.txt
@@ -14,9 +14,13 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#}
+-#}
+
+{% trans username=username, verification_url=verification_url|safe -%}
Hi {{ username }},
-to activate your GNU MediaGoblin account, open the following URL in your web browser
+to activate your GNU MediaGoblin account, open the following URL in
+your web browser:
-{{ verification_url|safe }}
+{{ verification_url }}
+{%- endtrans %}
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index 4da685f9..986e0995 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -19,7 +19,7 @@
<html>
<head>
<meta charset="utf-8">
- <title>{% block title %}GNU MediaGoblin{% endblock title %}</title>
+ <title>{% block title %}{% trans %}GNU MediaGoblin{% endtrans %}{% endblock title %}</title>
<link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/extlib/reset.css') }}"/>
<link rel="stylesheet" type="text/css"
@@ -42,13 +42,13 @@
<a class="mediagoblin_logo"
href="{{ request.urlgen('index') }}">
<img src="{{ request.staticdirect('/images/logo.png') }}"
- alt="Mediagoblin logo" />
+ alt="{% trans %}Mediagoblin logo{% endtrans %}" />
</a>
{% endblock %}
{% if request.user and request.user['status'] == 'active' %}
<a class="header_submit"
href="{{ request.urlgen('mediagoblin.submit.start') }}">
- Submit media
+ {% trans %}Submit media{% endtrans %}
</a>
{% endif %}
{% block mediagoblin_header_title %}{% endblock %}
@@ -59,7 +59,7 @@
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
user=request.user['username']) }}"
class="header_submit">
- verify your email!</a>
+ {% trans %}verify your email!{% endtrans %}</a>
{% endif %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
@@ -69,7 +69,7 @@
(<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">logout</a>)
{% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}">
- Login</a>
+ {% trans %}Login{% endtrans %}</a>
{% endif %}
</div>
</div>
@@ -85,7 +85,9 @@
{% block mediagoblin_footer %}
<div class="container_16">
<div class="grid_16 mediagoblin_footer">
- Powered by <a href="http://mediagoblin.org">MediaGoblin</a>, a <a href="http://gnu.org/">GNU project</a>
+ {% trans -%}
+ Powered by <a href="http://mediagoblin.org">MediaGoblin</a>, a <a href="http://gnu.org/">GNU project</a>
+ {%- endtrans %}
</div>
</div>
{% 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">
<div class="grid_8 prefix_1 suffix_1 edit_box form_box">
- <h1>Editing {{ media.title }}</h1>
+ <h1>{% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
media['media_files']['thumb']) }}" />
</div>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
- <a href="{{ media.url_for_self(request.urlgen) }}">Cancel</a>
- <input type="submit" value="Save changes" class="button" />
+ <a href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a>
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
index a11b86d7..534e5f20 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
@@ -25,10 +25,14 @@
user['username'] }}"
method="POST" enctype="multipart/form-data">
<div class="grid_8 prefix_1 suffix_1 edit_box form_box">
- <h1>Editing {{ user['username'] }}'s profile</h1>
+ <h1>
+ {%- trans username=user['username'] -%}
+ Editing {{ username }}'s profile
+ {%- endtrans %}
+ </h1>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button" />
+ <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html
index 6f10ec8d..a013797f 100644
--- a/mediagoblin/templates/mediagoblin/listings/tag.html
+++ b/mediagoblin/templates/mediagoblin/listings/tag.html
@@ -26,7 +26,7 @@
{% block mediagoblin_content -%}
<h1>
- Media tagged with: {{ tag_name }}
+ {% trans %}Media tagged with:{% endtrans %} {{ tag_name }}
</h1>
<div class="container_16 media_gallery">
@@ -36,6 +36,8 @@
<div class="grid_16">
<a href="{{ request.urlgen(
'mediagoblin.listings.tag_atom_feed',
- tag=tag_slug) }}">atom feed</a>
+ tag=tag_slug) }}">
+ {%- trans %}atom feed{% endtrans -%}
+ </a>
</div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index ed7b931f..a4e19984 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -22,17 +22,21 @@
{% if request.user %}
<p>
- <a href="{{ request.urlgen('mediagoblin.submit.start') }}">Submit an item</a>
+ <a href="{{ request.urlgen('mediagoblin.submit.start') }}">
+ {%- trans %}Submit an item{% endtrans -%}
+ </a>
</p>
{% else %}
<p>
- If you have an account, you can
- <a href="{{ request.urlgen('mediagoblin.auth.login') }}">Login</a>.
+ {% trans login_url=request.urlgen('mediagoblin.auth.login') -%}
+ If you have an account, you can <a href="{{ login_url }}">Login</a>.
+ {%- endtrans %}
</p>
{% if allow_registration %}
<p>
- If you don't have an account, please
- <a href="{{ request.urlgen('mediagoblin.auth.register') }}">Register</a>.
+ {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
+ If you don't have an account, please <a href="{{ register_url }}">Register</a>.
+ {%- endtrans %}
</p>
{% endif %}
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html
index 6d00510c..eb34c2e2 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -23,13 +23,13 @@
<form action="{{ request.urlgen('mediagoblin.submit.start') }}"
method="POST" enctype="multipart/form-data">
<div class="grid_8 prefix_1 suffix_1 form_box">
- <h1>Submit yer media</h1>
+ <h1>{% trans %}Submit yer media{% endtrans %}</h1>
{{ 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) }}
<div class="form_submit_buttons">
- <input type="submit" value="Submit" class="button" />
+ <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
index 637c892d..a66a547e 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
@@ -27,21 +27,27 @@
{% block mediagoblin_content -%}
{% if user %}
<h1>
- <a href="{{ request.urlgen(
- 'mediagoblin.user_pages.user_home',
- user=user.username) }}">{{ user.username }}</a>'s media</h1>
+ {%- trans username=user.username,
+ user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username) -%}
+ <a href="{{ user_url }}">{{ username }}</a>'s media
+ {%- endtrans %}
+ </h1>
</div>
<div class="container_16 media_gallery">
{% include "mediagoblin/utils/object_gallery.html" %}
</div>
<div class="grid_16">
- <a href={{ request.urlgen(
+ <a href="{{ request.urlgen(
'mediagoblin.user_pages.atom_feed',
- user=user.username) }}>atom feed</a>
+ user=user.username) }}">
+ {%- trans %}atom feed{% endtrans -%}
+ </a>
</div>
{% else %}
{# This *should* not occur as the view makes sure we pass in a user. #}
- <p>Sorry, no such user found.<p/>
+ <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/>
{% endif %}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
index a1382518..afc0d903 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media.html
@@ -38,24 +38,26 @@
{% endautoescape %}
<p>
- &mdash;&nbsp;uploaded on
- {{ "%4d-%02d-%02d"|format(media.created.year,
- media.created.month, media.created.day) }}
- by
- <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user= media.uploader().username) }}">
- {{- media.uploader().username }}</a>
+ {% 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 -%}
+ &mdash;&nbsp;uploaded on {{ date }} by <a href="{{ user_url }}">{{ username }}</a>
+ {%- endtrans %}
</p>
<br />
- <h3>Comments</h3>
+ <h3>{% trans %}Comments{% endtrans %}</h3>
{% if request.user %}
<form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
user= media.uploader().username,
media=media._id) }}" method="POST">
{{ wtforms_util.render_field_div(comment_form.comment_content) }}
<div class="form_submit_buttons">
- <input type="submit" value="Post comment!" class="button" />
+ <input type="submit" value="{% trans %}Post comment!{% endtrans %}" class="button" />
</div>
</form>
{% endif %}
@@ -77,7 +79,7 @@
<div class="comment_author">&mdash;
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
user = comment_author['username']) }}">
- {{ comment_author['username'] }}</a> at
+ {{ comment_author['username'] }}</a> {% trans %}at{% endtrans %}
<!--</div>
<div class="comment_datetime">-->
<a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
@@ -103,11 +105,9 @@
<div class="grid_5 omega">
{% include "mediagoblin/utils/prev_next.html" %}
- <h3>Sidebar content here!</h3>
-
- <p>
{% if media['uploader'] == request.user['_id'] or
request.user['is_admin'] %}
+ <h3>Temporary button holder</h3>
<p>
<a href="{{ request.urlgen('mediagoblin.edit.edit_media',
user= media.uploader().username,
@@ -117,16 +117,15 @@
</p>
<p>
<img src="{{ request.staticdirect('/images/icon_delete.png') }}"
- class="media_icon" />delete
+ class="media_icon" />{% trans %}delete{% endtrans %}
</p>
{% endif %}
- </p>
{% if media.tags %}
{% include "mediagoblin/utils/tags.html" %}
{% endif %}
</div>
{% else %}
- <p>Sorry, no such media found.<p/>
+ <p>{% trans %}Sorry, no such media found.{% endtrans %}<p/>
{% endif %}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
index 76cf36be..1115fc56 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/user.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/user.html
@@ -27,53 +27,62 @@
{% block mediagoblin_content -%}
{# If no user... #}
{% if not user %}
- <p>Sorry, no such user found.<p/>
+ <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/>
{# User exists, but needs verification #}
{% elif user.status == "needs_email_verification" %}
{% if user == request.user %}
{# this should only be visible when you are this user #}
<div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>Verification needed</h1>
+ <h1>{% trans %}Verification needed{% endtrans %}</h1>
- <p>Almost done! Your account still needs to be verified.</p>
<p>
- An email should arrive in a few moments with instructions
- on how to do so.
+ {% trans -%}
+ Almost done! Your account still needs to be verified.
+ {%- endtrans %}
</p>
- <p>In case it doesn't:</p>
+ <p>
+ {% trans -%}
+ An email should arrive in a few moments with instructions on how to do so.
+ {%- endtrans %}
+ </p>
+ <p>{% trans %}In case it doesn't:{% endtrans %}</p>
<a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}"
- class="button">Resend verification email</a>
+ class="button">{% trans %}Resend verification email{% endtrans %}</a>
</div>
{% else %}
{# if the user is not you, but still needs to verify their email #}
<div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>Verification needed</h1>
+ <h1>{% trans %}Verification needed{% endtrans %}</h1>
<p>
- Someone has registered an account with this username, but it
- still has to be verified.
+ {% trans -%}
+ Someone has registered an account with this username, but it still has to be verified.
+ {%- endtrans %}
</p>
<p>
- If you are that person but you've lost your verification
- email, you can
- <a href="{{ request.urlgen('mediagoblin.auth.login') }}">log in</a>
- and resend it.
+ {% trans login_url=request.urlgen('mediagoblin.auth.login') -%}
+ If you are that person but you've lost your verification email, you can <a href="{{ login_url }}">log in</a> and resend it.
+ {%- endtrans %}
</p>
</div>
{% endif %}
{# Active(?) (or at least verified at some point) user, horray! #}
{% else %}
- <h1>{{ user.username }}'s profile</h1>
+ <h1>
+ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
+ </h1>
<div class="grid_6 alpha">
{% include "mediagoblin/utils/profile.html" %}
{% if request.user['_id'] == user['_id'] or request.user['is_admin'] %}
<a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
- user.username }}">Edit profile</a>
+ user.username }}">
+ {%- trans %}Edit profile{% endtrans -%}
+ </a>
{% endif %}
</div>
@@ -81,10 +90,16 @@
{% set pagination_base_url = user_gallery_url %}
{% include "mediagoblin/utils/object_gallery.html" %}
<div class="clear"></div>
- <p><a href="{{ user_gallery_url }}">View all of {{ user.username }}'s media</a></p>
- <a href={{ request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- user=user.username) }}>atom feed</a>
+ <p>
+ <a href="{{ user_gallery_url }}">
+ {% trans username=user.username -%}
+ View all of {{ username }}'s media{% endtrans -%}
+ </a>
+ </p>
+ <a href="{{ request.urlgen( 'mediagoblin.user_pages.atom_feed',
+ user=user.username) }}">
+ {%- trans %}atom feed{% endtrans -%}
+ </a>
</div>
<div class="clear"></div>
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 -%}
- <h4>Tags</h4>
+ <h3>Tags</h3>
<ul class="mediaentry_tags">
{% for tag in media.tags %}
<li class="tag">
diff --git a/mediagoblin/util.py b/mediagoblin/util.py
index 5880f856..c9f4a0ac 100644
--- a/mediagoblin/util.py
+++ b/mediagoblin/util.py
@@ -300,7 +300,7 @@ def send_email(from_addr, to_addrs, subject, message_body):
TRANSLATIONS_PATH = pkg_resources.resource_filename(
- 'mediagoblin', 'translations')
+ 'mediagoblin', 'i18n')
def locale_to_lower_upper(locale):
diff --git a/setup.py b/setup.py
index 3508f5f0..40715dd0 100644
--- a/setup.py
+++ b/setup.py
@@ -44,6 +44,7 @@ setup(
'webtest',
'ConfigObj',
'Markdown',
+ 'python-cloudfiles',
## For now we're expecting that users will install this from
## their package managers.
# 'lxml',
@@ -52,6 +53,7 @@ setup(
entry_points = """\
[console_scripts]
gmg = mediagoblin.gmg_commands:main_cli
+ pybabel = mediagoblin.babel.messages.frontend:main
[paste.app_factory]
app = mediagoblin.app:paste_app_factory