aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mediagoblin/auth/forms.py16
-rw-r--r--mediagoblin/auth/views.py39
-rw-r--r--mediagoblin/db/migrations.py10
-rw-r--r--mediagoblin/db/models.py7
-rw-r--r--mediagoblin/edit/forms.py17
-rw-r--r--mediagoblin/edit/views.py7
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin602 -> 5641 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po298
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po295
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin0 -> 5708 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po312
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin0 -> 5406 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po305
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin0 -> 5217 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po308
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin0 -> 5414 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po310
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin0 -> 5629 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po314
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin0 -> 5487 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po309
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin0 -> 5401 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po294
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin0 -> 5461 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po311
-rw-r--r--mediagoblin/storage.py139
-rw-r--r--mediagoblin/submit/forms.py8
-rw-r--r--mediagoblin/submit/views.py13
-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.html9
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/gallery.html18
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html33
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html55
-rw-r--r--mediagoblin/templates/mediagoblin/utils/tags.html2
-rw-r--r--mediagoblin/templates/mediagoblin/utils/wtforms.html25
-rw-r--r--mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mobin502 -> 0 bytes
-rw-r--r--mediagoblin/translations/en/LC_MESSAGES/mediagoblin.po23
-rw-r--r--mediagoblin/user_pages/forms.py9
-rw-r--r--mediagoblin/user_pages/views.py2
-rw-r--r--mediagoblin/util.py66
48 files changed, 3435 insertions, 199 deletions
diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py
index 7bc0aeb1..917909c5 100644
--- a/mediagoblin/auth/forms.py
+++ b/mediagoblin/auth/forms.py
@@ -16,34 +16,36 @@
import wtforms
+from mediagoblin.util import fake_ugettext_passthrough 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 19dafed0..55f42141 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)
@@ -44,20 +45,27 @@ 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()
+ 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.')
-
- else:
+ _(u'Sorry, a user with that name already exists.'))
+ 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
+
+ if extra_validation_passes:
# 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)
@@ -148,12 +156,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 +183,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/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']
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index a1783a72..2f3ed203 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 fake_ugettext_passthrough 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/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
index ba625623..6bb69ce9 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
+++ 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
index 715757fb..30c55e21 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -2,14 +2,17 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Rafael Maguiña <rafael.maguina@gmail.com>, 2011.
+# <mediagoblin.org@samba-tng.org>, 2011.
# <cwebber@dustycloud.org>, 2011.
+# Jan-Christoph Borchardt <JanCBorchardt@fsfe.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"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 23:20+0000\n"
+"Last-Translator: JanCBorchardt <JanCBorchardt@fsfe.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"
@@ -18,8 +21,297 @@ 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 "Benutzername"
+
+#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50
+msgid "Password"
+msgstr "Passwort"
+
+#: mediagoblin/auth/forms.py:34
+msgid "Passwords must match."
+msgstr "Passwörter müssen übereinstimmen."
+
+#: mediagoblin/auth/forms.py:36
+msgid "Confirm password"
+msgstr "Passwort wiederholen"
+
+#: mediagoblin/auth/forms.py:39
+msgid "Email address"
+msgstr "Email-Adresse"
+
+#: mediagoblin/auth/views.py:40
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Registrierung ist auf dieser Instanz leider deaktiviert."
+
+#: mediagoblin/auth/views.py:55
+msgid "Sorry, a user with that name already exists."
+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 ""
+"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 "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 "Bestätigungs-Email noch Mal senden."
+
+#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26
+msgid "Title"
+msgstr "Titel"
+
+#: mediagoblin/edit/forms.py:29
+msgid "Slug"
+msgstr "Kurztitel"
+
+#: mediagoblin/edit/forms.py:30
+msgid "The slug can't be empty"
+msgstr "Bitte gib einen Kurztitel ein"
+
+#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
+msgid "Tags"
+msgstr "Markierungen"
+
+#: mediagoblin/edit/forms.py:38
+msgid "Bio"
+msgstr "Biographie"
+
+#: mediagoblin/edit/forms.py:41
+msgid "Website"
+msgstr "Webseite"
+
+#: mediagoblin/edit/forms.py:43
+msgid "Improperly formed URL"
+msgstr "Adresse fehlerhaft"
+
+#: mediagoblin/edit/views.py:54
+msgid "An entry with that slug already exists for this user."
+msgstr "Diesen Kurztitel hast du bereits vergeben."
+
+#: mediagoblin/edit/views.py:75
+msgid "You are editing another user's media. Proceed with caution."
+msgstr "Du bearbeitest die Medien eines Anderen. Bitte sei vorsichtig."
+
+#: mediagoblin/edit/views.py:96
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig."
+
+#: mediagoblin/submit/forms.py:29
+msgid "File"
+msgstr "Datei"
+
+#: mediagoblin/submit/views.py:45
+msgid "You must provide a file."
+msgstr "Du musst eine Datei angeben."
+
+#: mediagoblin/submit/views.py:48
+msgid "The file doesn't seem to be an image!"
+msgstr "Diese Datei scheint kein Bild zu sein!"
+
+#: mediagoblin/submit/views.py:96
+msgid "Woohoo! Submitted!"
+msgstr "Yeeeaaah! Geschafft!"
+
+#: 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 "Medien hochladen"
+
+#: mediagoblin/templates/mediagoblin/base.html:62
+msgid "verify your email!"
+msgstr "Bitte bestätige deine Email-Adresse!"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "Login"
+msgstr "Anmelden"
+
+#: 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 ""
+"Läüft mit <a href=\"http://mediagoblin.org\">MediaGoblin</a>, einem <a "
+"href=\"http://gnu.org/\">GNU-Projekt</a>"
+
#: 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 "Eintrag hochladen"
+
+#: mediagoblin/templates/mediagoblin/root.html:31
+#, python-format
+msgid "If you have an account, you can <a href=\"%(login_url)s\">Login</a>."
+msgstr ""
+"Falls du ein Konto hast, kannst du dich <a "
+"href=\"%(login_url)s\">anmelden</a>."
+
+#: 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 ""
+"Wenn du noch kein Konto hast, <a href=\"%(register_url)s\">registriere "
+"dich</a>."
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:26
+msgid "Log in"
+msgstr "Anmelden"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:29
+msgid "Login failed!"
+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 "Bestätigen"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Don't have an account yet?"
+msgstr "Hast du noch kein Konto?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
+msgid "Create one here!"
+msgstr "Registriere dich!"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:27
+msgid "Create an account!"
+msgstr "Neues Konto registrieren!"
+
+#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"\n"
+"to activate your GNU MediaGoblin account, open the following URL in\n"
+"your web browser:\n"
+"\n"
+"%(verification_url)s"
+msgstr ""
+"Hi %(username)s,\n"
+"\n"
+"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
+msgid "Editing %(media_title)s"
+msgstr "%(media_title)s bearbeiten"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+msgid "Save changes"
+msgstr "Änderungen speichern"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr "%(username)s’s Profil barbeiten"
+
+#: mediagoblin/templates/mediagoblin/listings/tag.html:29
+msgid "Media tagged with:"
+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 "Atom-Feed"
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:26
+msgid "Submit yer media"
+msgstr "Medien hochladen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "<a href=\"%(user_url)s\">%(username)s</a>’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 "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 "Überprüfung notwendig"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:40
+msgid "Almost done! Your account still needs to be verified."
+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 "Wenn sie nicht ankommt:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:52
+msgid "Resend verification email"
+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
+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 ""
+"Wenn dir dieses Konto gehört und die Bestätigungsmail weg ist, kannst du "
+"dich <a href=\"%(login_url)s\">anmelden</a> und sie erneut senden."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:76
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)s’s Profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:84
+msgid "Edit profile"
+msgstr "Profil bearbeiten"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:95
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr "Alle Medien von %(username)s anschauen"
+
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
index 67830c2e..0de5ca62 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 <http://www.gnu.org/licenses/>.
+# 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: 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 22:53-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"
@@ -29,7 +17,276 @@ 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 ""
+
+#: 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/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/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..dfd3a1bc
--- /dev/null
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..0a12586c
--- /dev/null
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,312 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# <jacobo@gnu.org>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 20:30+0000\n"
+"Last-Translator: nvjacobo <jacobo@gnu.org>\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 "Las contraseñas deben coincidir."
+
+#: mediagoblin/auth/forms.py:36
+msgid "Confirm password"
+msgstr "Confirme su contraseña"
+
+#: mediagoblin/auth/forms.py:39
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+#: mediagoblin/auth/views.py:40
+msgid "Sorry, registration is disabled on this instance."
+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 "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
+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 "Título"
+
+#: mediagoblin/edit/forms.py:29
+msgid "Slug"
+msgstr "Ficha"
+
+#: mediagoblin/edit/forms.py:30
+msgid "The slug can't be empty"
+msgstr "La ficha no puede estar vacia"
+
+#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: 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 ""
+"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 "Usted está editando un perfil de usuario. Proceder con precaucións."
+
+#: 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 logo"
+
+#: mediagoblin/templates/mediagoblin/base.html:51
+msgid "Submit media"
+msgstr "Enviar contenido"
+
+#: 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 "Conectarse"
+
+#: 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 ""
+"Potenciado por <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+
+#: 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 "Enviar un item"
+
+#: mediagoblin/templates/mediagoblin/root.html:31
+#, python-format
+msgid "If you have an account, you can <a href=\"%(login_url)s\">Login</a>."
+msgstr ""
+"Si tiene una cuenta, puede iniciar sesión <a "
+"href=\"%(login_url)s\">Login</a>."
+
+#: 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 ""
+"Si no tienes una cuenta, por favor, <a "
+"href=\"%(register_url)s\">Regístrese</a> ."
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:26
+msgid "Log in"
+msgstr "Conectarse"
+
+#: 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 "Enviar"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Don't have an account yet?"
+msgstr "¿No tienes una cuenta?"
+
+#: 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 "Crea una cuenta!"
+
+#: 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 ""
+"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 "Edición %(media_title)s "
+
+#: 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 "Edición %(username)s de perfil"
+
+#: mediagoblin/templates/mediagoblin/listings/tag.html:29
+msgid "Media tagged with:"
+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 "feed Atom"
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:26
+msgid "Submit yer media"
+msgstr "Envíe su contenido"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "Contenido de <a href=\"%(user_url)s\">%(username)s</a>'s"
+
+#: 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 "Verificación necesaria"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:40
+msgid "Almost done! Your account still needs to be verified."
+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 "En caso de que no:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:52
+msgid "Resend verification email"
+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
+msgid ""
+"If you are that person but you've lost your verification email, you can <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+"Si usted es esa persona, pero usted ha perdido su correo electrónico de "
+"verificación, usted puede reenviarlo <a href=\"%(login_url)s\">acceder</a>."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:76
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s's"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:84
+msgid "Edit profile"
+msgstr "Editar perfil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:95
+#, python-format
+msgid "View all of %(username)s's media"
+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 00000000..a7daf2c9
--- /dev/null
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
Binary files differ
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.
+#
+# <marktraceur@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 21:24+0000\n"
+"Last-Translator: MarkTraceur <marktraceur@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: 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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+msgstr ""
+"Alimenté par <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un <a "
+"href=\"http://gnu.org/\">projet GNU</a>"
+
+#: 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr ""
+"Si vous avez un compte, vous pouvez <a href=\"%(login_url)s\">Connecter</a>."
+
+#: 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 ""
+"Si vous n'avez pas un compte, s'il vous plaît, <a "
+"href=\"%(register_url)s\">vous inscrivez</a>."
+
+#: 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 "<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/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..8911785f
--- /dev/null
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..bd00fd1f
--- /dev/null
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,308 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# <odin.omdal@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 21:23+0000\n"
+"Last-Translator: velmont <odin.omdal@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: 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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+msgstr ""
+"Driven av <a href=\"http://mediagoblin.org\">MediaGoblin</a>, eit <a "
+"href=\"http://gnu.org/\">GNU-prosjekt</a>"
+
+#: 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr "Har du ein konto? <a href=\"%(login_url)s\">Logg inn</a>."
+
+#: 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 "Har du ingen konto? <a href=\"%(register_url)s\">Registrer deg</a>."
+
+#: 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 "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "<a href=\"%(user_url)s\">%(username)s</a> 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 <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+"Viss dette er deg, kan du <a href=\"%(login_url)s\">logga inn</a> 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
new file mode 100644
index 00000000..4dc4ab5f
--- /dev/null
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..43f65af6
--- /dev/null
+++ b/mediagoblin/i18n/pt_BR/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.
+#
+# <snd.noise@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 23:16+0000\n"
+"Last-Translator: osc <snd.noise@gmail.com>\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 "Nome de Usuário"
+
+#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:50
+msgid "Password"
+msgstr "Senha"
+
+#: mediagoblin/auth/forms.py:34
+msgid "Passwords must match."
+msgstr "Senhas devem ser iguais."
+
+#: mediagoblin/auth/forms.py:36
+msgid "Confirm password"
+msgstr "Confirmar senha"
+
+#: mediagoblin/auth/forms.py:39
+msgid "Email address"
+msgstr "Endereço de email"
+
+#: mediagoblin/auth/views.py:40
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Desculpa, o registro está desativado neste momento."
+
+#: mediagoblin/auth/views.py:55
+msgid "Sorry, a user with that name already exists."
+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 "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 "O email de verificação foi reenviado."
+
+#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:26
+msgid "Title"
+msgstr "Título"
+
+#: mediagoblin/edit/forms.py:29
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:30
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
+msgid "Tags"
+msgstr "Tags"
+
+#: mediagoblin/edit/forms.py:38
+msgid "Bio"
+msgstr "Biográfia"
+
+#: mediagoblin/edit/forms.py:41
+msgid "Website"
+msgstr "Website"
+
+#: 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 "Arquivo"
+
+#: mediagoblin/submit/views.py:45
+msgid "You must provide a file."
+msgstr "Você deve fornecer um arquivo."
+
+#: mediagoblin/submit/views.py:48
+msgid "The file doesn't seem to be an image!"
+msgstr "O arquivo não parece ser uma imagem!"
+
+#: mediagoblin/submit/views.py:96
+msgid "Woohoo! Submitted!"
+msgstr "Eba! Enviado!"
+
+#: 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 "Enviar mídia"
+
+#: mediagoblin/templates/mediagoblin/base.html:62
+msgid "verify your email!"
+msgstr "Verifique seu email!"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "Login"
+msgstr "Login"
+
+#: 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 ""
+"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+
+#: mediagoblin/templates/mediagoblin/root.html:21
+msgid "Welcome to GNU MediaGoblin!"
+msgstr "Bemvindo 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr "Se você tem conta, você pode <a href=\"%(login_url)s\">Entrar</a> ."
+
+#: 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 ""
+"Se você não tem conta, por favor <a href=\"%(register_url)s\">Registrar</a> "
+"."
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:26
+msgid "Log in"
+msgstr "Entrar"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:29
+msgid "Login failed!"
+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 "Enviar"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Don't have an account yet?"
+msgstr "Ainda não tem conta?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
+msgid "Create one here!"
+msgstr "Crie uma aqui!"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:27
+msgid "Create an account!"
+msgstr "Criar uma conta!"
+
+#: 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 ""
+"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 "Editando %(media_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+msgid "Save changes"
+msgstr "Salvar mudanças"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr "Editando perfil de %(username)s"
+
+#: 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 "atom feed"
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:26
+msgid "Submit yer media"
+msgstr "Envie sua mídia"
+
+#: 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 "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 "Verificação necessária"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:40
+msgid "Almost done! Your account still needs to be verified."
+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 "Receberá um email com instruções de como fazer."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:49
+msgid "In case it doesn't:"
+msgstr "Caso contrário:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:52
+msgid "Resend verification email"
+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
+msgid ""
+"If you are that person but you've lost your verification email, you can <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+"Se você é essa pessoa, mas você perdeu seu e-mail de verificação, você pode "
+"<a href=\"%(login_url)s\">efetuar login</a> e reenviá-la."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:76
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:84
+msgid "Edit profile"
+msgstr "Editar perfil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:95
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..361846d4
--- /dev/null
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..feb261c8
--- /dev/null
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,314 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# <gapop@hotmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 21:52+0000\n"
+"Last-Translator: gap <gapop@hotmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+msgstr ""
+"Construit cu <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un <a "
+"href=\"http://gnu.org/\">proiect GNU</a>"
+
+#: 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr ""
+"Dacă aveți deja un cont, vă puteți <a "
+"href=\"%(login_url)s\">autentifica</a>."
+
+#: 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 ""
+"Dacă nu aveți cont, vă rugăm să vă <a "
+"href=\"%(register_url)s\">înregistrați</a>."
+
+#: 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 "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "Fișierele lui <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: 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 <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+"Dacă dvs. sunteți persoana respectivă și nu mai aveți e-mail-ul de "
+"verificare, puteți să vă <a href=\"%(login_url)s\">autentificați</a> pentru "
+"a-l retrimite."
+
+#: 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 00000000..a70b1fef
--- /dev/null
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..bf2dd4fa
--- /dev/null
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,309 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Jure Repinc <jlp@holodeck1.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-10 21:28+0000\n"
+"Last-Translator: JLP <jlp@holodeck1.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: 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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+msgstr ""
+"Stran poganja <a href=\"http://mediagoblin.org\">MediaGoblin</a>, del <a "
+"href=\"http://gnu.org/\">projekta GNU</a>"
+
+#: 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr "Če imate račun, se lahko <a href=\"%(login_url)s\">Prijavite</a>."
+
+#: 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 "Če računa še nimate, se <a href=\"%(register_url)s\">Registrirajte</a>."
+
+#: 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 "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "Vsebina uporabnika <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: 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 <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+"Če ste ta oseba vi, a ste izgubili potrditveno e-pošto, se lahko <a "
+"href=\"%(login_url)s\">prijavite</a> 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"
+
+
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..153584d3
--- /dev/null
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..ec8611ee
--- /dev/null
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,294 @@
+# 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 22:53-0500\n"
+"PO-Revision-Date: 2011-08-09 03:57+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n"
+"MIME-Version: 1.0\n"
+"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/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 <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/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/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..04fe0b6f
--- /dev/null
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..311c5656
--- /dev/null
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,311 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# <transifex@wandborg.se>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2011-08-08 22:53-0500\n"
+"PO-Revision-Date: 2011-08-09 15:00+0000\n"
+"Last-Translator: joar <transifex@wandborg.se>\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/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"
+
+#: 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 <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU project</a>"
+msgstr ""
+"Drivs av <a href=\"http://mediagoblin.org\">MediaGoblin</a>, ett <a "
+"href=\"http://gnu.org/\">GNU</a>-projekt"
+
+#: 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 <a href=\"%(login_url)s\">Login</a>."
+msgstr "Har du ett konto? <a href=\"%(login_url)s\">Logga in</a>."
+
+#: 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 ""
+"Har du inget konto? <a href=\"%(register_url)s\">Registrera ett konto</a>."
+
+#: 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/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 "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr "<a href=\"%(user_url)s\">%(username)s</a>s media"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html: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 <a "
+"href=\"%(login_url)s\">log in</a> 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 <a "
+"href=\"%(login_url)s\">logga in</a> 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"
+
+
diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py
index e449eda3..3968fa29 100644
--- a/mediagoblin/storage.py
+++ b/mediagoblin/storage.py
@@ -286,6 +286,145 @@ class CloudFilesStorage(StorageInterface):
return self.get_file(filepath).public_uri()
+class MountStorage(StorageInterface):
+ """
+ Experimental "Mount" virtual Storage Interface
+
+ This isn't an interface to some real storage, instead it's a
+ redirecting interface, that redirects requests to other
+ "StorageInterface"s.
+
+ For example, say you have the paths:
+
+ 1. ['user_data', 'cwebber', 'avatar.jpg']
+ 2. ['user_data', 'elrond', 'avatar.jpg']
+ 3. ['media_entries', '34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg']
+
+ You could mount media_entries under CloudFileStorage and user_data
+ under BasicFileStorage. Then 1 would be passed to
+ BasicFileStorage under the path ['cwebber', 'avatar.jpg'] and 3
+ would be passed to CloudFileStorage under
+ ['34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg'].
+
+ In other words, this is kind of like mounting /home/ and /etc/
+ under different filesystems on your operating system... but with
+ mediagoblin filestorages :)
+
+ To set this up, you currently need to call the mount() method with
+ the target path and a backend, that shall be available under that
+ target path. You have to mount things in a sensible order,
+ especially you can't mount ["a", "b"] before ["a"].
+ """
+ def __init__(self, **kwargs):
+ self.mounttab = {}
+
+ def mount(self, dirpath, backend):
+ """
+ Mount a new backend under dirpath
+ """
+ new_ent = clean_listy_filepath(dirpath)
+
+ print "Mounting:", repr(new_ent)
+ already, rem_1, table, rem_2 = self._resolve_to_backend(new_ent, True)
+ print "===", repr(already), repr(rem_1), repr(rem_2), len(table)
+
+ assert (len(rem_2) > 0) or (None not in table), \
+ "That path is already mounted"
+ assert (len(rem_2) > 0) or (len(table)==0), \
+ "A longer path is already mounted here"
+
+ for part in rem_2:
+ table[part] = {}
+ table = table[part]
+ table[None] = backend
+
+ def _resolve_to_backend(self, filepath, extra_info = False):
+ """
+ extra_info = True is for internal use!
+
+ Normally, returns the backend and the filepath inside that backend.
+
+ With extra_info = True it returns the last directory node and the
+ remaining filepath from there in addition.
+ """
+ table = self.mounttab
+ filepath = filepath[:]
+ res_fp = None
+ while True:
+ new_be = table.get(None)
+ if (new_be is not None) or res_fp is None:
+ res_be = new_be
+ res_fp = filepath[:]
+ res_extra = (table, filepath[:])
+ # print "... New res: %r, %r, %r" % (res_be, res_fp, res_extra)
+ if len(filepath) == 0:
+ break
+ query = filepath.pop(0)
+ entry = table.get(query)
+ if entry is not None:
+ table = entry
+ res_extra = (table, filepath[:])
+ else:
+ break
+ if extra_info:
+ return (res_be, res_fp) + res_extra
+ else:
+ return (res_be, res_fp)
+
+ def resolve_to_backend(self, filepath):
+ backend, filepath = self._resolve_to_backend(filepath)
+ if backend is None:
+ raise Error("Path not mounted")
+ return backend, filepath
+
+ def __repr__(self, table = None, indent = []):
+ res = []
+ if table is None:
+ res.append("MountStorage<")
+ table = self.mounttab
+ v = table.get(None)
+ if v:
+ res.append(" " * len(indent) + repr(indent) + ": " + repr(v))
+ for k, v in table.iteritems():
+ if k == None:
+ continue
+ res.append(" " * len(indent) + repr(k) + ":")
+ res += self.__repr__(v, indent + [k])
+ if table is self.mounttab:
+ res.append(">")
+ return "\n".join(res)
+ else:
+ return res
+
+ def file_exists(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.file_exists(filepath)
+
+ def get_file(self, filepath, mode='r'):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.get_file(filepath, mode)
+
+ def delete_file(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.delete_file(filepath)
+
+ def file_url(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.file_url(filepath)
+
+ def get_local_path(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.get_local_path(filepath)
+
+ def copy_locally(self, filepath, dest_path):
+ """
+ Need to override copy_locally, because the local_storage
+ attribute is not correct.
+ """
+ backend, filepath = self.resolve_to_backend(filepath)
+ backend.copy_locally(filepath, dest_path)
+
+
###########
# Utilities
###########
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index f02c95a6..4519b057 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 fake_ugettext_passthrough as _
class SubmitStartForm(wtforms.Form):
+ file = wtforms.FileField(_('File'))
title = wtforms.TextField(
- 'Title',
+ _('Title'),
[wtforms.validators.Length(min=0, max=500)])
description = wtforms.TextAreaField('Description of this work')
- 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..a3a58400 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -20,9 +20,11 @@ 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)
+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,15 +43,16 @@ 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
# create entry and save in database
entry = request.db.MediaEntry()
+ entry['_id'] = ObjectId()
entry['title'] = (
request.POST['title']
or unicode(splitext(filename)[0]))
@@ -65,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()
@@ -92,7 +91,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'])
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..3a40850d 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -23,13 +23,10 @@
<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>
- {{ 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) }}
+ <h1>{% trans %}Submit yer media{% endtrans %}</h1>
+ {{ wtforms_util.render_divs(submit_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/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..9c0a1cca 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) }}
+ {{ wtforms_util.render_divs(comment_form) }}
<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/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html
index 1d2f8619..2639522a 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) %}
<div class="form_field_box">
- <div class="form_field_label">{{ field.label }}</div>
+ <div class="form_field_label">{{ _(field.label.text) }}</div>
{% if field.description -%}
- <div class="form_field_description">{{ field.description }}</div>
+ <div class="form_field_description">{{ _(field.description) }}</div>
{%- endif %}
<div class="form_field_input">{{ field }}</div>
{%- if field.errors -%}
@@ -34,25 +34,6 @@
</div>
{%- endmacro %}
-{# Generically render a textarea
- # ... mostly the same thing except it includes rows and cols #}
-{% macro render_textarea_div(field, rows=8, cols=20) %}
- <div class="form_field_box">
- <div class="form_field_label">{{ field.label }}</div>
- {% if field.description -%}
- <div class="form_field_description">{{ field.description }}</div>
- {%- endif %}
- <div class="form_field_input">{{ field(rows=rows, cols=cols) }}</div>
- {%- if field.errors -%}
- {% for error in field.errors %}
- <div class="form_field_error">
- {{ error }}
- </div>
- {% endfor %}
- {%- endif %}
- </div>
-{%- endmacro %}
-
{# Auto-render a form as a series of divs #}
{% macro render_divs(form) -%}
{% for field in form %}
@@ -64,7 +45,7 @@
{% macro render_table(form) -%}
{% for field in form %}
<tr>
- <th>{{field.label}}</th>
+ <th>{{ _(field.label.text) }}</th>
<td>
{{field}}
{% if field.errors %}
diff --git a/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo b/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo
deleted file mode 100644
index fb7046cd..00000000
--- a/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.mo
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.po
deleted file mode 100644
index 3bec204e..00000000
--- a/mediagoblin/translations/en/LC_MESSAGES/mediagoblin.po
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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-05-12 22:28-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/root.html:22
-msgid "Welcome to GNU MediaGoblin!"
-msgstr ""
-
diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py
index 8829b674..25001019 100644
--- a/mediagoblin/user_pages/forms.py
+++ b/mediagoblin/user_pages/forms.py
@@ -16,7 +16,10 @@
import wtforms
+from mediagoblin.util import fake_ugettext_passthrough as _
+
+
class MediaCommentForm(wtforms.Form):
- comment_content = wtforms.TextAreaField(
- 'Comment',
- [wtforms.validators.Required()])
+ comment_content = wtforms.TextAreaField(
+ _('Comment'),
+ [wtforms.validators.Required()])
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'],
diff --git a/mediagoblin/util.py b/mediagoblin/util.py
index c9f4a0ac..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
@@ -93,8 +95,8 @@ 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.ngettext)
+ mg_globals.translations.ugettext,
+ mg_globals.translations.ungettext)
# All templates will know how to ...
# ... fetch all waiting messages and remove them from the queue
@@ -478,6 +480,66 @@ 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)
+
+
+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):