aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/source/siteadmin/media-types.rst7
-rw-r--r--extlib/flask-wtf/LICENSE31
-rw-r--r--extlib/flask-wtf/html5.py125
-rw-r--r--mediagoblin/admin/routing.py7
-rw-r--r--mediagoblin/app.py87
-rw-r--r--mediagoblin/auth/routing.py35
-rw-r--r--mediagoblin/auth/views.py30
-rw-r--r--mediagoblin/db/sql/migrations.py23
-rw-r--r--mediagoblin/db/sql/models.py39
-rw-r--r--mediagoblin/edit/routing.py14
-rw-r--r--mediagoblin/edit/views.py65
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mobin16826 -> 21970 bytes
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po336
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mobin15832 -> 20976 bytes
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mobin15557 -> 20701 bytes
-rw-r--r--mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin16517 -> 21755 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po438
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mobin16642 -> 21898 bytes
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po346
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin17018 -> 22501 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po485
-rw-r--r--mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mobin16589 -> 21733 bytes
-rw-r--r--mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin16496 -> 21640 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po336
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mobin15596 -> 20746 bytes
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po339
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mobin16208 -> 21803 bytes
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po485
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mobin16171 -> 21315 bytes
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mobin16075 -> 21219 bytes
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po340
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin15358 -> 20502 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po340
-rw-r--r--mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mobin16305 -> 21592 bytes
-rw-r--r--mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po376
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin15821 -> 20965 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po336
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin16783 -> 22190 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po440
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mobin21760 -> 27975 bytes
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po346
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mobin16770 -> 22081 bytes
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po374
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin15785 -> 20929 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mobin16537 -> 21681 bytes
-rw-r--r--mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po340
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin15698 -> 20842 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin15919 -> 21063 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po336
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mobin15844 -> 20988 bytes
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mobin15642 -> 20786 bytes
-rw-r--r--mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po334
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mobin15722 -> 20866 bytes
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po340
-rw-r--r--mediagoblin/init/celery/from_celery.py61
-rw-r--r--mediagoblin/listings/routing.py16
-rw-r--r--mediagoblin/meddleware/csrf.py2
-rw-r--r--mediagoblin/media_types/__init__.py4
-rw-r--r--mediagoblin/media_types/audio/spectrogram.py357
-rw-r--r--mediagoblin/media_types/image/processing.py5
-rw-r--r--mediagoblin/media_types/video/processing.py5
-rw-r--r--mediagoblin/media_types/video/transcoders.py304
-rw-r--r--mediagoblin/plugins/api/__init__.py17
-rw-r--r--mediagoblin/plugins/api/tools.py20
-rw-r--r--mediagoblin/plugins/api/views.py29
-rw-r--r--mediagoblin/plugins/flatpagesfile/__init__.py3
-rw-r--r--mediagoblin/plugins/httpapiauth/__init__.py58
-rw-r--r--mediagoblin/plugins/oauth/README.rst13
-rw-r--r--mediagoblin/plugins/oauth/__init__.py54
-rw-r--r--mediagoblin/plugins/oauth/forms.py70
-rw-r--r--mediagoblin/plugins/oauth/migrations.py46
-rw-r--r--mediagoblin/plugins/oauth/models.py101
-rw-r--r--mediagoblin/plugins/oauth/templates/oauth/authorize.html31
-rw-r--r--mediagoblin/plugins/oauth/templates/oauth/client/connections.html34
-rw-r--r--mediagoblin/plugins/oauth/templates/oauth/client/list.html45
-rw-r--r--mediagoblin/plugins/oauth/templates/oauth/client/register.html34
-rw-r--r--mediagoblin/plugins/oauth/tools.py43
-rw-r--r--mediagoblin/plugins/oauth/views.py196
-rw-r--r--mediagoblin/processing/task.py8
-rw-r--r--mediagoblin/routing.py58
-rw-r--r--mediagoblin/static/css/base.css42
-rw-r--r--mediagoblin/static/js/header_dropdown.js30
-rw-r--r--mediagoblin/storage/cloudfiles.py5
-rw-r--r--mediagoblin/submit/routing.py11
-rw-r--r--mediagoblin/submit/views.py34
-rw-r--r--mediagoblin/templates/mediagoblin/base.html24
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/image.html11
-rw-r--r--mediagoblin/templates/mediagoblin/root.html9
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html10
-rw-r--r--mediagoblin/templates/mediagoblin/utils/object_gallery.html3
-rw-r--r--mediagoblin/templates/mediagoblin/utils/profile.html2
-rw-r--r--mediagoblin/tests/test_http_callback.py81
-rw-r--r--mediagoblin/tests/test_mgoblin_app.ini4
-rw-r--r--mediagoblin/tests/test_oauth.py183
-rw-r--r--mediagoblin/tests/tools.py8
-rw-r--r--mediagoblin/themes/airy/assets/css/airy.css31
-rw-r--r--mediagoblin/themes/airy/assets/images/empty_dots.pngbin0 -> 205 bytes
-rw-r--r--mediagoblin/themes/airy/assets/images/icon_feed.pngbin0 -> 473 bytes
-rw-r--r--mediagoblin/themes/airy/templates/mediagoblin/base.html20
-rw-r--r--mediagoblin/themes/airy/templates/mediagoblin/extra_head.html4
-rw-r--r--mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html23
l---------mediagoblin/tools/extlib/wtf_html5.py1
-rw-r--r--mediagoblin/tools/pagination.py3
-rw-r--r--mediagoblin/tools/pluginapi.py3
-rw-r--r--mediagoblin/tools/processing.py89
-rw-r--r--mediagoblin/tools/translate.py22
-rw-r--r--mediagoblin/user_pages/routing.py110
-rw-r--r--mediagoblin/user_pages/views.py22
-rw-r--r--mediagoblin/webfinger/routing.py12
-rw-r--r--setup.py1
118 files changed, 10277 insertions, 1937 deletions
diff --git a/docs/source/siteadmin/media-types.rst b/docs/source/siteadmin/media-types.rst
index d062da95..5653217f 100644
--- a/docs/source/siteadmin/media-types.rst
+++ b/docs/source/siteadmin/media-types.rst
@@ -96,6 +96,13 @@ On Debianoid systems, run::
sudo apt-get install libsndfile1-dev
+.. note::
+ scikits.audiolab will display a warning every time it's imported if you do
+ not compile it with alsa support. Alsa support is not necessary for the GNU
+ MediaGoblin application but if you do not wish the alsa warnings from
+ audiolab you should also install ``libasound2-dev`` before installing
+ scikits.audiolab.
+
Then install ``scikits.audiolab`` for the spectrograms::
./bin/pip install scikits.audiolab
diff --git a/extlib/flask-wtf/LICENSE b/extlib/flask-wtf/LICENSE
new file mode 100644
index 00000000..00199ae6
--- /dev/null
+++ b/extlib/flask-wtf/LICENSE
@@ -0,0 +1,31 @@
+Copyright (c) 2010 by Dan Jacob.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+* The names of the contributors may not be used to endorse or
+ promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/extlib/flask-wtf/html5.py b/extlib/flask-wtf/html5.py
new file mode 100644
index 00000000..4ffd8b77
--- /dev/null
+++ b/extlib/flask-wtf/html5.py
@@ -0,0 +1,125 @@
+from wtforms import TextField
+from wtforms import IntegerField as _IntegerField
+from wtforms import DecimalField as _DecimalField
+from wtforms import DateField as _DateField
+from wtforms.widgets import Input
+
+class DateInput(Input):
+ """
+ Creates `<input type=date>` widget
+ """
+ input_type = "date"
+
+
+class NumberInput(Input):
+ """
+ Creates `<input type=number>` widget
+ """
+ input_type="number"
+
+
+class RangeInput(Input):
+ """
+ Creates `<input type=range>` widget
+ """
+ input_type="range"
+
+
+class URLInput(Input):
+ """
+ Creates `<input type=url>` widget
+ """
+ input_type = "url"
+
+
+class EmailInput(Input):
+ """
+ Creates `<input type=email>` widget
+ """
+
+ input_type = "email"
+
+
+class SearchInput(Input):
+ """
+ Creates `<input type=search>` widget
+ """
+
+ input_type = "search"
+
+class TelInput(Input):
+ """
+ Creates `<input type=tel>` widget
+ """
+
+ input_type = "tel"
+
+
+class SearchField(TextField):
+ """
+ **TextField** using **SearchInput** by default
+ """
+ widget = SearchInput()
+
+
+class DateField(_DateField):
+ """
+ **DateField** using **DateInput** by default
+ """
+
+ widget = DateInput()
+
+
+class URLField(TextField):
+ """
+ **TextField** using **URLInput** by default
+ """
+
+ widget = URLInput()
+
+
+class EmailField(TextField):
+ """
+ **TextField** using **EmailInput** by default
+ """
+
+ widget = EmailInput()
+
+class TelField(TextField):
+ """
+ **TextField** using **TelInput** by default
+ """
+
+ widget = TelInput()
+
+
+class IntegerField(_IntegerField):
+ """
+ **IntegerField** using **NumberInput** by default
+ """
+
+ widget = NumberInput()
+
+
+class DecimalField(_DecimalField):
+ """
+ **DecimalField** using **NumberInput** by default
+ """
+
+ widget = NumberInput()
+
+
+class IntegerRangeField(_IntegerField):
+ """
+ **IntegerField** using **RangeInput** by default
+ """
+
+ widget = RangeInput()
+
+
+class DecimalRangeField(_DecimalField):
+ """
+ **DecimalField** using **RangeInput** by default
+ """
+
+ widget = RangeInput()
diff --git a/mediagoblin/admin/routing.py b/mediagoblin/admin/routing.py
index ea768c24..29515f12 100644
--- a/mediagoblin/admin/routing.py
+++ b/mediagoblin/admin/routing.py
@@ -14,8 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes.route import Route
-
admin_routes = [
- Route('mediagoblin.admin.panel', '/panel',
- controller='mediagoblin.admin.views:admin_processing_panel')]
+ ('mediagoblin.admin.panel',
+ '/panel',
+ 'mediagoblin.admin.views:admin_processing_panel')]
diff --git a/mediagoblin/app.py b/mediagoblin/app.py
index 51f5899a..3a2d00f0 100644
--- a/mediagoblin/app.py
+++ b/mediagoblin/app.py
@@ -15,13 +15,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
-import urllib
import logging
-import routes
-from webob import Request, exc
+from mediagoblin.routing import url_map, view_functions, add_route
-from mediagoblin import routing, meddleware, __version__
+from werkzeug.wrappers import Request
+from werkzeug.exceptions import HTTPException, NotFound
+
+from mediagoblin import meddleware, __version__
from mediagoblin.tools import common, translate, template
from mediagoblin.tools.response import render_404
from mediagoblin.tools.theme import register_themes
@@ -89,7 +90,11 @@ class MediaGoblinApp(object):
self.public_store, self.queue_store = setup_storage()
# set up routing
- self.routing = routing.get_mapper(PluginManager().get_routes())
+ self.url_map = url_map
+
+ for route in PluginManager().get_routes():
+ _log.debug('adding plugin route: {0}'.format(route))
+ add_route(*route)
# set up staticdirector tool
self.staticdirector = get_staticdirector(app_config)
@@ -127,9 +132,13 @@ class MediaGoblinApp(object):
def call_backend(self, environ, start_response):
request = Request(environ)
+ ## Compatibility webob -> werkzeug
+ request.GET = request.args
+ request.accept_language = request.accept_languages
+ request.accept = request.accept_mimetypes
+
## Routing / controller loading stuff
- path_info = request.path_info
- route_match = self.routing.match(path_info)
+ map_adapter = self.url_map.bind_to_environ(request.environ)
# By using fcgi, mediagoblin can run under a base path
# like /mediagoblin/. request.path_info contains the
@@ -137,7 +146,7 @@ class MediaGoblinApp(object):
# full path of the current page, that should include
# the basepath.
# Note: urlgen and routes are fine!
- request.full_path = environ["SCRIPT_NAME"] + request.path_info
+ request.full_path = environ["SCRIPT_NAME"] + request.path
# python-routes uses SCRIPT_NAME. So let's use that too.
# The other option would be:
# request.full_path = environ["SCRIPT_URL"]
@@ -148,47 +157,55 @@ class MediaGoblinApp(object):
environ.pop('HTTPS')
## Attach utilities to the request object
- request.matchdict = route_match
- request.urlgen = routes.URLGenerator(self.routing, environ)
# Do we really want to load this via middleware? Maybe?
request.session = request.environ['beaker.session']
# Attach self as request.app
# Also attach a few utilities from request.app for convenience?
request.app = self
- request.locale = translate.get_locale_from_request(request)
- request.template_env = template.get_jinja_env(
- self.template_loader, request.locale)
request.db = self.db
request.staticdirect = self.staticdirector
+ request.locale = translate.get_locale_from_request(request)
+ request.template_env = template.get_jinja_env(
+ self.template_loader, request.locale)
+
+ def build_proxy(endpoint, **kw):
+ try:
+ qualified = kw.pop('qualified')
+ except KeyError:
+ qualified = False
+
+ return map_adapter.build(
+ endpoint,
+ values=dict(**kw),
+ force_external=qualified)
+
+ request.urlgen = build_proxy
+
mg_request.setup_user_in_request(request)
- # No matching page?
- if route_match is None:
- # Try to do see if we have a match with a trailing slash
- # added and if so, redirect
- if not path_info.endswith('/') \
- and request.method == 'GET' \
- and self.routing.match(path_info + '/'):
- new_path_info = path_info + '/'
- if request.GET:
- new_path_info = '%s?%s' % (
- new_path_info, urllib.urlencode(request.GET))
- redirect = exc.HTTPFound(location=new_path_info)
- return request.get_response(redirect)(environ, start_response)
-
- # Okay, no matches. 404 time!
- request.matchdict = {} # in case our template expects it
+ try:
+ endpoint, url_values = map_adapter.match()
+ request.matchdict = url_values
+ except NotFound as exc:
return render_404(request)(environ, start_response)
+ except HTTPException as exc:
+ # Support legacy webob.exc responses
+ return exc(environ, start_response)
+
+ view_func = view_functions[endpoint]
+
+ _log.debug('endpoint: {0} view_func: {1}'.format(
+ endpoint,
+ view_func))
- # import the controller, or if it's already a callable, call that
- route_controller = route_match['controller']
- if isinstance(route_controller, unicode) \
- or isinstance(route_controller, str):
- controller = common.import_component(route_match['controller'])
+ # import the endpoint, or if it's already a callable, call that
+ if isinstance(view_func, unicode) \
+ or isinstance(view_func, str):
+ controller = common.import_component(view_func)
else:
- controller = route_match['controller']
+ controller = view_func
# pass the request through our meddleware classes
for m in self.meddleware:
diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py
index 15d8fc3c..2a6abb47 100644
--- a/mediagoblin/auth/routing.py
+++ b/mediagoblin/auth/routing.py
@@ -14,25 +14,20 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes.route import Route
auth_routes = [
- Route('mediagoblin.auth.register', '/register/',
- controller='mediagoblin.auth.views:register'),
- Route('mediagoblin.auth.login', '/login/',
- controller='mediagoblin.auth.views:login'),
- Route('mediagoblin.auth.logout', '/logout/',
- controller='mediagoblin.auth.views:logout'),
- Route('mediagoblin.auth.verify_email', '/verify_email/',
- controller='mediagoblin.auth.views:verify_email'),
- Route('mediagoblin.auth.resend_verification', '/resend_verification/',
- controller='mediagoblin.auth.views:resend_activation'),
- Route('mediagoblin.auth.resend_verification_success',
- '/resend_verification_success/',
- template='mediagoblin/auth/resent_verification_email.html',
- controller='mediagoblin.views:simple_template_render'),
- Route('mediagoblin.auth.forgot_password', '/forgot_password/',
- controller='mediagoblin.auth.views:forgot_password'),
- Route('mediagoblin.auth.verify_forgot_password',
- '/forgot_password/verify/',
- controller='mediagoblin.auth.views:verify_forgot_password')]
+ ('mediagoblin.auth.register', '/register/',
+ 'mediagoblin.auth.views:register'),
+ ('mediagoblin.auth.login', '/login/',
+ 'mediagoblin.auth.views:login'),
+ ('mediagoblin.auth.logout', '/logout/',
+ 'mediagoblin.auth.views:logout'),
+ ('mediagoblin.auth.verify_email', '/verify_email/',
+ 'mediagoblin.auth.views:verify_email'),
+ ('mediagoblin.auth.resend_verification', '/resend_verification/',
+ 'mediagoblin.auth.views:resend_activation'),
+ ('mediagoblin.auth.forgot_password', '/forgot_password/',
+ 'mediagoblin.auth.views:forgot_password'),
+ ('mediagoblin.auth.verify_forgot_password',
+ '/forgot_password/verify/',
+ 'mediagoblin.auth.views:verify_forgot_password')]
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
index 71a5f379..5b77c122 100644
--- a/mediagoblin/auth/views.py
+++ b/mediagoblin/auth/views.py
@@ -55,12 +55,12 @@ def register(request):
_('Sorry, registration is disabled on this instance.'))
return redirect(request, "index")
- register_form = auth_forms.RegistrationForm(request.POST)
+ register_form = auth_forms.RegistrationForm(request.form)
if request.method == 'POST' and register_form.validate():
# TODO: Make sure the user doesn't exist already
- username = unicode(request.POST['username'].lower())
- em_user, em_dom = unicode(request.POST['email']).split("@", 1)
+ username = unicode(request.form['username'].lower())
+ em_user, em_dom = unicode(request.form['email']).split("@", 1)
em_dom = em_dom.lower()
email = em_user + "@" + em_dom
users_with_username = request.db.User.find(
@@ -85,7 +85,7 @@ def register(request):
user.username = username
user.email = email
user.pw_hash = auth_lib.bcrypt_gen_password_hash(
- request.POST['password'])
+ request.form['password'])
user.verification_key = unicode(uuid.uuid4())
user.save(validate=True)
@@ -115,21 +115,21 @@ def login(request):
If you provide the POST with 'next', it'll redirect to that view.
"""
- login_form = auth_forms.LoginForm(request.POST)
+ login_form = auth_forms.LoginForm(request.form)
login_failed = False
if request.method == 'POST' and login_form.validate():
user = request.db.User.find_one(
- {'username': request.POST['username'].lower()})
+ {'username': request.form['username'].lower()})
- if user and user.check_login(request.POST['password']):
+ if user and user.check_login(request.form['password']):
# set up login in session
request.session['user_id'] = unicode(user._id)
request.session.save()
- if request.POST.get('next'):
- return exc.HTTPFound(location=request.POST['next'])
+ if request.form.get('next'):
+ return exc.HTTPFound(location=request.form['next'])
else:
return redirect(request, "index")
@@ -143,7 +143,7 @@ def login(request):
request,
'mediagoblin/auth/login.html',
{'login_form': login_form,
- 'next': request.GET.get('next') or request.POST.get('next'),
+ 'next': request.GET.get('next') or request.form.get('next'),
'login_failed': login_failed,
'allow_registration': mg_globals.app_config["allow_registration"]})
@@ -236,17 +236,17 @@ def forgot_password(request):
Sends an email with an url to renew forgotten password
"""
- fp_form = auth_forms.ForgotPassForm(request.POST,
+ fp_form = auth_forms.ForgotPassForm(request.form,
username=request.GET.get('username'))
if request.method == 'POST' and fp_form.validate():
# '$or' not available till mongodb 1.5.3
user = request.db.User.find_one(
- {'username': request.POST['username']})
+ {'username': request.form['username']})
if not user:
user = request.db.User.find_one(
- {'email': request.POST['username']})
+ {'email': request.form['username']})
if user:
if user.email_verified and user.status == 'active':
@@ -322,7 +322,7 @@ def verify_forgot_password(request):
if request.method == 'POST' and cp_form.validate():
user.pw_hash = auth_lib.bcrypt_gen_password_hash(
- request.POST['password'])
+ request.form['password'])
user.fp_verification_key = None
user.fp_token_expire = None
user.save()
@@ -355,7 +355,7 @@ def _process_for_token(request):
if request.method == 'GET':
formdata_vars = request.GET
else:
- formdata_vars = request.POST
+ formdata_vars = request.form
formdata = {
'vars': formdata_vars,
diff --git a/mediagoblin/db/sql/migrations.py b/mediagoblin/db/sql/migrations.py
index fb178285..1d822cd9 100644
--- a/mediagoblin/db/sql/migrations.py
+++ b/mediagoblin/db/sql/migrations.py
@@ -16,14 +16,12 @@
import datetime
-from sqlalchemy import (MetaData, Table, Column, Boolean, SmallInteger,
+from sqlalchemy import (MetaData, Table, Column, Boolean, SmallInteger,
Integer, Unicode, UnicodeText, DateTime, ForeignKey)
-
-
from mediagoblin.db.sql.util import RegisterMigration
-from mediagoblin.db.sql.models import MediaEntry, Collection, User
-
+from mediagoblin.db.sql.models import MediaEntry, Collection, User, \
+ ProcessingMetaData
MIGRATIONS = {}
@@ -66,6 +64,7 @@ def add_transcoding_progress(db_conn):
col.create(media_entry)
db_conn.commit()
+
@RegisterMigration(4, MIGRATIONS)
def add_collection_tables(db_conn):
metadata = MetaData(bind=db_conn.bind)
@@ -92,6 +91,7 @@ def add_collection_tables(db_conn):
db_conn.commit()
+
@RegisterMigration(5, MIGRATIONS)
def add_mediaentry_collected(db_conn):
metadata = MetaData(bind=db_conn.bind)
@@ -103,3 +103,16 @@ def add_mediaentry_collected(db_conn):
col.create(media_entry)
db_conn.commit()
+
+@RegisterMigration(6, MIGRATIONS)
+def create_processing_metadata_table(db):
+ metadata = MetaData(bind=db.bind)
+
+ metadata_table = Table('core__processing_metadata', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('media_entry_id', Integer, ForeignKey(MediaEntry.id),
+ nullable=False, index=True),
+ Column('callback_url', Unicode))
+
+ metadata_table.create()
+ db.commit()
diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py
index 5862f722..b48c1fbe 100644
--- a/mediagoblin/db/sql/models.py
+++ b/mediagoblin/db/sql/models.py
@@ -22,10 +22,10 @@ TODO: indexes on foreignkeys, where useful.
import datetime
import sys
-from sqlalchemy import (
- Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
- UniqueConstraint, PrimaryKeyConstraint, SmallInteger)
-from sqlalchemy.orm import relationship
+from sqlalchemy import Column, Integer, Unicode, UnicodeText, DateTime, \
+ Boolean, ForeignKey, UniqueConstraint, PrimaryKeyConstraint, \
+ SmallInteger
+from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql.expression import desc
from sqlalchemy.ext.associationproxy import association_proxy
@@ -85,6 +85,14 @@ class User(Base, UserMixin):
_id = SimpleFieldAlias("id")
+ def __repr__(self):
+ return '<{0} #{1} {2} {3} "{4}">'.format(
+ self.__class__.__name__,
+ self.id,
+ 'verified' if self.email_verified else 'non-verified',
+ 'admin' if self.is_admin else 'user',
+ self.username)
+
class MediaEntry(Base, MediaEntryMixin):
"""
@@ -362,12 +370,12 @@ class Collection(Base, CollectionMixin):
slug = Column(Unicode)
created = Column(DateTime, nullable=False, default=datetime.datetime.now,
index=True)
- description = Column(UnicodeText)
+ description = Column(UnicodeText)
creator = Column(Integer, ForeignKey(User.id), nullable=False)
items = Column(Integer, default=0)
get_creator = relationship(User)
-
+
def get_collection_items(self, ascending=False):
order_col = CollectionItem.position
if not ascending:
@@ -404,9 +412,26 @@ class CollectionItem(Base, CollectionItemMixin):
return DictReadAttrProxy(self)
+class ProcessingMetaData(Base):
+ __tablename__ = 'core__processing_metadata'
+
+ id = Column(Integer, primary_key=True)
+ media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=False,
+ index=True)
+ media_entry = relationship(MediaEntry,
+ backref=backref('processing_metadata',
+ cascade='all, delete-orphan'))
+ callback_url = Column(Unicode)
+
+ @property
+ def dict_view(self):
+ """A dict like view on this object"""
+ return DictReadAttrProxy(self)
+
+
MODELS = [
User, MediaEntry, Tag, MediaTag, MediaComment, Collection, CollectionItem, MediaFile, FileKeynames,
- MediaAttachmentFile]
+ MediaAttachmentFile, ProcessingMetaData]
######################################################
diff --git a/mediagoblin/edit/routing.py b/mediagoblin/edit/routing.py
index 321c1f44..28b73d1e 100644
--- a/mediagoblin/edit/routing.py
+++ b/mediagoblin/edit/routing.py
@@ -14,13 +14,9 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+from mediagoblin.routing import add_route
-from routes.route import Route
-
-edit_routes = [
- # Media editing view handled in user_pages/routing.py
- Route('mediagoblin.edit.profile', '/profile/',
- controller="mediagoblin.edit.views:edit_profile"),
- Route('mediagoblin.edit.account', '/account/',
- controller="mediagoblin.edit.views:edit_account"),
- ]
+add_route('mediagoblin.edit.profile', '/edit/profile/',
+ 'mediagoblin.edit.views:edit_profile')
+add_route('mediagoblin.edit.account', '/edit/account/',
+ 'mediagoblin.edit.views:edit_account')
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index 37fe3ba8..2d42ff0b 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -51,27 +51,27 @@ def edit_media(request, media):
license=media.license)
form = forms.EditForm(
- request.POST,
+ request.form,
**defaults)
if request.method == 'POST' and form.validate():
# Make sure there isn't already a MediaEntry with such a slug
# and userid.
slug_used = check_media_slug_used(request.db, media.uploader,
- request.POST['slug'], media.id)
+ request.form['slug'], media.id)
if slug_used:
form.slug.errors.append(
_(u'An entry with that slug already exists for this user.'))
else:
- media.title = unicode(request.POST['title'])
- media.description = unicode(request.POST.get('description'))
+ media.title = unicode(request.form['title'])
+ media.description = unicode(request.form.get('description'))
media.tags = convert_to_tag_list_of_dicts(
- request.POST.get('tags'))
+ request.form.get('tags'))
- media.license = unicode(request.POST.get('license', '')) or None
+ media.license = unicode(request.form.get('license', '')) or None
- media.slug = unicode(request.POST['slug'])
+ media.slug = unicode(request.form['slug'])
media.save()
@@ -106,9 +106,8 @@ def edit_attachments(request, media):
form = forms.EditAttachmentsForm()
# Add any attachements
- if ('attachment_file' in request.POST
- and isinstance(request.POST['attachment_file'], FieldStorage)
- and request.POST['attachment_file'].file):
+ if 'attachment_file' in request.files \
+ and request.files['attachment_file']:
# Security measure to prevent attachments from being served as
# text/html, which will be parsed by web clients and pose an XSS
@@ -121,13 +120,13 @@ def edit_attachments(request, media):
# machine parsing the upload form, and not necessarily the machine
# serving the attachments.
if mimetypes.guess_type(
- request.POST['attachment_file'].filename)[0] in \
+ request.files['attachment_file'].filename)[0] in \
UNSAFE_MIMETYPES:
public_filename = secure_filename('{0}.notsafe'.format(
- request.POST['attachment_file'].filename))
+ request.files['attachment_file'].filename))
else:
public_filename = secure_filename(
- request.POST['attachment_file'].filename)
+ request.files['attachment_file'].filename)
attachment_public_filepath \
= mg_globals.public_store.get_unique_filepath(
@@ -139,13 +138,13 @@ def edit_attachments(request, media):
try:
attachment_public_file.write(
- request.POST['attachment_file'].file.read())
+ request.files['attachment_file'].stream.read())
finally:
- request.POST['attachment_file'].file.close()
+ request.files['attachment_file'].stream.close()
media.attachment_files.append(dict(
- name=request.POST['attachment_name'] \
- or request.POST['attachment_file'].filename,
+ name=request.form['attachment_name'] \
+ or request.files['attachment_file'].filename,
filepath=attachment_public_filepath,
created=datetime.utcnow(),
))
@@ -155,8 +154,8 @@ def edit_attachments(request, media):
messages.add_message(
request, messages.SUCCESS,
"You added the attachment %s!" \
- % (request.POST['attachment_name']
- or request.POST['attachment_file'].filename))
+ % (request.form['attachment_name']
+ or request.files['attachment_file'].filename))
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
@@ -183,13 +182,13 @@ def edit_profile(request):
else:
user = request.user
- form = forms.EditProfileForm(request.POST,
+ form = forms.EditProfileForm(request.form,
url=user.get('url'),
bio=user.get('bio'))
if request.method == 'POST' and form.validate():
- user.url = unicode(request.POST['url'])
- user.bio = unicode(request.POST['bio'])
+ user.url = unicode(request.form['url'])
+ user.bio = unicode(request.form['bio'])
user.save()
@@ -210,7 +209,7 @@ def edit_profile(request):
@require_active_login
def edit_account(request):
user = request.user
- form = forms.EditAccountForm(request.POST,
+ form = forms.EditAccountForm(request.form,
wants_comment_notification=user.get('wants_comment_notification'))
if request.method == 'POST':
@@ -268,30 +267,32 @@ def edit_collection(request, collection):
description=collection.description)
form = forms.EditCollectionForm(
- request.POST,
+ request.form,
**defaults)
if request.method == 'POST' and form.validate():
# Make sure there isn't already a Collection with such a slug
# and userid.
slug_used = check_collection_slug_used(request.db, collection.creator,
- request.POST['slug'], collection.id)
-
+ request.form['slug'], collection.id)
+
# Make sure there isn't already a Collection with this title
existing_collection = request.db.Collection.find_one({
'creator': request.user._id,
- 'title':request.POST['title']})
-
+ 'title':request.form['title']})
+
if existing_collection and existing_collection.id != collection.id:
messages.add_message(
- request, messages.ERROR, _('You already have a collection called "%s"!' % request.POST['title']))
+ request, messages.ERROR,
+ _('You already have a collection called "%s"!') % \
+ request.form['title'])
elif slug_used:
form.slug.errors.append(
_(u'A collection with that slug already exists for this user.'))
else:
- collection.title = unicode(request.POST['title'])
- collection.description = unicode(request.POST.get('description'))
- collection.slug = unicode(request.POST['slug'])
+ collection.title = unicode(request.form['title'])
+ collection.description = unicode(request.form.get('description'))
+ collection.slug = unicode(request.form['slug'])
collection.save()
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
index a1341a57..eaec0daa 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
index 4fb5be78..cf090994 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: ar\n"
-"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -94,7 +94,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "العنوان"
@@ -103,7 +105,8 @@ msgid "Description of this work"
msgstr "وصف هذا العمل."
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -118,11 +121,11 @@ msgstr "الوسوم"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "المسار"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "لا يمكن ترك المسار فارغًا"
@@ -165,30 +168,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "يوجد ملف آخر بهذا المسار لدى هذى المستخدم."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "أنت تحرّر ملف مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -210,6 +242,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -218,14 +316,19 @@ msgstr ""
msgid "File"
msgstr "الملف"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "يجب أن تضع ملفًا."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "يا سلام! نُشرَت!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "صورة قزم مرتبك"
@@ -256,28 +359,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "لِج"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -443,12 +550,17 @@ msgid "Editing %(media_title)s"
msgstr "تحرير %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "ألغِ"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "احفظ التغييرات"
@@ -459,12 +571,19 @@ msgstr "احفظ التغييرات"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "تحرير ملف %(username)s الشخصي"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -524,13 +643,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "أتود حقًا حذف %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -561,14 +734,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -595,22 +760,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "أتود حقًا حذف %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -700,10 +869,28 @@ msgid "Add media"
msgstr "أضف وسائط"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -755,35 +942,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "أنا متأكد من رغبتي بحذف هذا العمل"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "أنت على وشك حذف وسائط مستخدم آخر. كن حذرًا أثناء العملية."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
index 99dfca51..89fde97f 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
index 853be57e..ee4a0aca 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: ca\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Títol"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Etiquetes"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -164,30 +167,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Esteu editant fitxers d'un altre usuari. Aneu amb compte."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte"
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Aquest tipus de fitxer no és vàlid."
@@ -217,14 +315,19 @@ msgstr "Aquest tipus de fitxer no és vàlid."
msgid "File"
msgstr "Fitxer"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Heu d'escollir un fitxer."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Visca! S'ha enviat!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Imatge de la pantalla 404, el goblin no sap què fer..."
@@ -255,28 +358,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Entra"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "Edició %(media_title)s "
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Cancel·la"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Desa els canvis"
@@ -458,12 +570,19 @@ msgstr "Desa els canvis"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,13 +642,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -560,14 +733,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -594,22 +759,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "Tots els fitxers"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "Icona RSS"
@@ -754,35 +941,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
index f36c1081..23685f41 100644
--- a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
index 203d0262..0426e9ed 100644
--- a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: da\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titel"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr ""
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -164,30 +167,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -217,14 +315,19 @@ msgstr ""
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Billede af stresset 404 goblin"
@@ -255,28 +358,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Log ind"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Afbryd"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Gem ændringer"
@@ -458,12 +570,19 @@ msgstr "Gem ændringer"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redigerer %(username)s profil"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,13 +642,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -560,14 +733,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -594,22 +759,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -754,35 +941,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
index 9d346851..015a480c 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 024ad4be..6a1605c3 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -18,16 +18,16 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-05 10:01-0500\n"
-"PO-Revision-Date: 2012-08-12 10:30+0000\n"
-"Last-Translator: Jakob Kramer <jakob.kramer@gmx.de>\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/mediagoblin/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: de\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -102,7 +102,9 @@ msgstr "Es konnte niemand mit diesem Nutzernamen oder Email gefunden werden."
msgid "You can now log in using your new password."
msgstr "Du kannst dich jetzt mit deinem neuen Passwort anmelden."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titel"
@@ -111,7 +113,8 @@ msgid "Description of this work"
msgstr "Beschreibung des Werkes"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -126,11 +129,11 @@ msgstr "Schlagwörter"
msgid "Separate tags by commas."
msgstr "Kommaseparierte Schlagwörter"
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Kurztitel"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
@@ -173,30 +176,59 @@ msgstr "Neues Passwort"
msgid "Email me when others comment on my media"
msgstr "Mir eine E-Mail schicken, wenn andere meine Medien kommentieren"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Diesen Kurztitel hast du bereits vergeben."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Du bearbeitest die Medien eines Anderen. Sei bitte vorsichtig."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du bearbeitest das Profil eines Anderen. Sei bitte vorsichtig."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Das Profil wurde aktualisiert"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Kontoeinstellungen gespeichert"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Falsches Passwort"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr "Theme kann nicht verknüpft werden … Kein Theme gesetzt\n"
@@ -218,6 +250,72 @@ msgstr "Entschuldigung, dieser Dateityp wird nicht unterstützt."
msgid "Video transcoding failed"
msgstr "Videokonvertierung fehlgeschlagen"
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
@@ -226,27 +324,32 @@ msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
msgid "File"
msgstr "Datei"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Du musst eine Datei angeben."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Yeeeaaah! Geschafft!"
-#: mediagoblin/templates/mediagoblin/404.html:22
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Bild eines angespannten Goblins"
-#: mediagoblin/templates/mediagoblin/404.html:23
+#: mediagoblin/templates/mediagoblin/404.html:25
msgid "Oops!"
msgstr "Hoppla!"
-#: mediagoblin/templates/mediagoblin/404.html:24
+#: mediagoblin/templates/mediagoblin/404.html:26
msgid "There doesn't seem to be a page at this address. Sorry!"
msgstr "Tut uns Leid, aber unter der angegebenen Adresse gibt es keine Seite!"
-#: mediagoblin/templates/mediagoblin/404.html:26
+#: mediagoblin/templates/mediagoblin/404.html:28
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
@@ -264,27 +367,32 @@ msgstr "Bitte bestätige deine E-Mail-Adresse!"
msgid "+ Add media"
msgstr "+ Medien hinzufügen"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Dein Profil ansehen"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Abmelden"
-#: mediagoblin/templates/mediagoblin/base.html:74
-#: mediagoblin/templates/mediagoblin/auth/login.html:32
-#: mediagoblin/templates/mediagoblin/auth/login.html:50
+#: mediagoblin/templates/mediagoblin/base.html:75
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Anmelden"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Diese Seite setzt das <a href=\"http://gnu.org/\">GNU</a>-Projekt <a href=\"http://mediagoblin.org/\">MediaGoblin</a> ein."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -328,58 +436,62 @@ msgstr "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Registrie
msgid "Most recent media"
msgstr "Neuste Medien"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:22
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
msgid "Media processing panel"
msgstr "Medienverarbeitung"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:25
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
msgstr "Hier kann man den Status von zu verarbeitenden Medien in diesem MediaGoblin-Exemplar sehen."
-#: mediagoblin/templates/mediagoblin/admin/panel.html:28
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
msgid "Media in-processing"
msgstr "Medien in Bearbeitung"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:54
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:52
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
msgid "No media in-processing"
msgstr "Keine Medien in Bearbeitung"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:55
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
msgid "These uploads failed to process:"
msgstr "Die folgenden Uploads sind fehlgeschlagen:"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:86
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:82
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
msgid "No failed entries!"
msgstr "Keine fehlgeschlagenen Einträge!"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:88
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
msgstr "Die letzten zehn erfolgreichen Uploads"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:108
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:103
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
msgid "No processed entries, yet!"
msgstr "Noch keine verarbeiteten Einträge!"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
msgstr "Dein neues Passwort"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
msgid "Set password"
msgstr "Passwort setzen"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
msgid "Recover password"
msgstr "Passwort wiederherstellen"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
msgid "Send instructions"
msgstr "Anweisungen senden"
@@ -397,27 +509,28 @@ msgid ""
"a happy goblin!"
msgstr "Hallo %(username)s,\n\num dein GNU-MediaGoblin-Passwort zu ändern, öffne folgende URL\nin deinem Webbrowser:\n\n%(verification_url)s\n\nWenn du denkst, dass es sich hierbei um einen Fehler handelt,\nignoriere einfach diese E-Mail und bleib ein glücklicher Goblin!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
msgid "Logging in failed!"
msgstr "Anmeldevorgang fehlgeschlagen!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:40
+#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Hast du noch keines? Es geht ganz einfach!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:41
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
msgstr "Registriere dich hier!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:47
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: mediagoblin/templates/mediagoblin/auth/register.html:32
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create an account!"
msgstr "Neues Konto registrieren!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:36
+#: mediagoblin/templates/mediagoblin/auth/register.html:40
msgid "Create"
msgstr "Registrieren"
@@ -432,32 +545,53 @@ msgid ""
"%(verification_url)s"
msgstr "Hallo %(username)s,\n\num dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in deinem Webbrowser öffnen:\n\n%(verification_url)s"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
#, python-format
msgid "Editing %(media_title)s"
msgstr "%(media_title)s bearbeiten"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Abbrechen"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:37
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+#: mediagoblin/templates/mediagoblin/edit/edit.html:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Änderungen speichern"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:41
#, python-format
msgid "Changing %(username)s's account settings"
msgstr "%(username)ss Kontoeinstellungen ändern"
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)ss Profil bearbeiten"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -517,14 +651,69 @@ msgstr "Hol dir auf <a href=\"http://getfirefox.com\">http://getfirefox.com</a>
msgid "WebM file (640p; VP8/Vorbis)"
msgstr "WebM-Datei (640p; VP8/Vorbis)"
-#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Add your media"
-msgstr "Deine Medien"
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
msgid "Add"
msgstr "Hinzufügen"
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr "Deine Medien"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Löschen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Möchtest du %(title)s wirklich löschen?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Dauerhaft löschen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
@@ -553,14 +742,6 @@ msgstr "❖ Medien von <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Image for %(media_title)s"
msgstr "Bild für %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Löschen"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Einen Kommentar schreiben"
@@ -587,30 +768,34 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Veröffentlicht am</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr "Anhänge"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr "Anhang hinzufügen"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Möchtest du %(title)s wirklich löschen?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Dauerhaft löschen"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr "Du kannst den Status der Medien, die sich gerade in Bearbeitung befinden, hier betrachten."
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
msgstr "Deine zehn letzten erfolgreichen Uploads"
@@ -692,10 +877,28 @@ msgid "Add media"
msgstr "Medien hinzufügen"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Scheinbar gibt es hier noch nichts …"
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "Feed-Symbol"
@@ -747,35 +950,94 @@ msgstr "Schlagwörter"
msgid "Could not read the image file."
msgstr "Die Bilddatei konnte nicht gelesen werden."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Ja, wirklich löschen"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr "hat dein Medium kommentiert"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Ohh, der Kommentar war leer."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Dein Kommentar wurde gesendet!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr "Manche Dateien dieses Eintrags scheinen zu fehlen. Es wird trotzdem gelöscht."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Du hast das Medium gelöscht."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Das Medium wurde nicht gelöscht, da nicht angekreuzt hast, dass du es wirklich löschen möchtest."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du versuchst Medien eines anderen Nutzers zu löschen. Sei bitte vorsichtig."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
index eab1940b..3e589f71 100644
--- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2012-08-22 16:54-0500\n"
+"POT-Creation-Date: 2012-09-24 14:01-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"
@@ -89,7 +89,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr ""
@@ -98,7 +100,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a "
@@ -114,11 +117,11 @@ msgstr ""
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -161,30 +164,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -206,6 +238,76 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can "
+"not be\n"
+" intercepted by the user agent (e.g. server-side "
+"client).<br />\n"
+" <strong>Public</strong> - The client can't make "
+"confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-"
+"side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -214,14 +316,19 @@ msgstr ""
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -252,28 +359,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +552,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr ""
@@ -457,12 +573,19 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +645,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -560,14 +737,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -594,22 +763,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -697,10 +870,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -752,35 +943,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid "Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed "
+"with caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were "
+"sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid "You are about to delete another user's collection. Proceed with caution."
+msgstr ""
+
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
index db98eb28..dbd2bc4d 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
index 8d0cfe23..2bfb4319 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
@@ -3,15 +3,15 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# <deletesoftware@yandex.ru>, 2011, 2012.
+# <deletesoftware@yandex.ru>, 2011-2012.
# Fernando Inocencio <faigos@gmail.com>, 2011.
# <john_w1954@fastmail.fm>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-21 14:20+0000\n"
+"POT-Creation-Date: 2012-09-24 11:41-0500\n"
+"PO-Revision-Date: 2012-09-24 18:27+0000\n"
"Last-Translator: aleksejrs <deletesoftware@yandex.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: eo\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -94,7 +94,9 @@ msgstr "Mi trovis neniun kun tiu salutnomo aŭ retpoŝtadreso."
msgid "You can now log in using your new password."
msgstr "Nun vi povas ensaluti per via nova pasvorto."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titolo"
@@ -103,7 +105,8 @@ msgid "Description of this work"
msgstr "Priskribo de ĉi tiu verko"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -118,11 +121,11 @@ msgstr "Etikedoj"
msgid "Separate tags by commas."
msgstr "Dividu la etikedojn per komoj."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "La distingiga adresparto"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
@@ -165,30 +168,58 @@ msgstr "La nova pasvorto"
msgid "Email me when others comment on my media"
msgstr "Retpoŝtu min kiam aliaj komentas pri miaj alŝutaĵoj."
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr "Priskribo de ĉi tiu kolekto"
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr "La distingiga adresparto de ĉi tiu kolekto. Ordinare ne necesas ĝin ŝanĝi."
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ĉi tiu uzanto jam havas dosieron kun tiu distingiga adresparto."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Profilŝanĝoj estis konservitaj"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Kontagordoj estis konservitaj"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Malĝusta pasvorto"
+#: mediagoblin/edit/views.py:287
+#, python-format
+msgid "You already have a collection called \"%s\"!title"
+msgstr "Vi jam havas kolekton kun la nomo «%s»!title"
+
+#: mediagoblin/edit/views.py:290
+msgid "A collection with that slug already exists for this user."
+msgstr "Ĉi tiu uzanto jam havas kolekton kun tiu distingiga adresparto."
+
+#: mediagoblin/edit/views.py:307
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr "Alligo de etoso ne eblas… ne estas elektita ekzistanta etoso\n"
@@ -210,6 +241,72 @@ msgstr "Mi pardonpetas, mi ne subtenas tiun dosiertipon :("
msgid "Video transcoding failed"
msgstr "Malsukcesis transkodado de filmo"
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "La provizita dosiero ne konformas al la informtipo."
@@ -218,14 +315,24 @@ msgstr "La provizita dosiero ne konformas al la informtipo."
msgid "File"
msgstr "Dosiero"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Vi devas provizi dosieron."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Hura! Alŝutitas!"
+#: mediagoblin/submit/views.py:211 mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Bildo de 404-koboldo penŝvitanta."
@@ -256,28 +363,32 @@ msgstr "Konfirmu viecon de la retpoŝtadreso!"
msgid "+ Add media"
msgstr "+ Aldoni dosieron"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Vidi vian profilon"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Elsaluti"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Ensaluti"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Funkcias per <a href=\"http://mediagoblin.org\">MediaGoblin</a>, unu el la <a href=\"http://gnu.org/\">projektoj de GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -443,12 +554,17 @@ msgid "Editing %(media_title)s"
msgstr "Priredaktado de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Konservi ŝanĝojn"
@@ -459,12 +575,19 @@ msgstr "Konservi ŝanĝojn"
msgid "Changing %(username)s's account settings"
msgstr "Ŝanĝado de kontagordoj de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redaktado de l’profilo de %(username)s'"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -524,14 +647,68 @@ msgstr "Vi povas akiri modernan TTT-legilon,\n<span class=\"whitespace other\" t
msgid "WebM file (640p; VP8/Vorbis)"
msgstr "la WebM-dosieron (640p; VP8/Vorbis)"
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Aldoni"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Aldono de via dosiero"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Aldoni"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Ŝanĝi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Forigi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Ĉu vere forigi %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Forigi senrevene"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -561,14 +738,6 @@ msgstr "❖ Просмотр файлов пользователя <a href=\"%(u
msgid "Image for %(media_title)s"
msgstr "Bildo de «%(media_title)s»"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Ŝanĝi"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Forigi"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Aldoni komenton"
@@ -595,23 +764,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Aldonita je</h3>\n <p>la %(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr "Kundosieroj"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr "Aldoni kundosieron"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Ĉu vere forigi %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Forigi senrevene"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -700,10 +873,28 @@ msgid "Add media"
msgstr "Aldoni dosieron"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ĉi tie ŝajne estas ankoraŭ neniuj dosieroj…"
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "flusimbolo"
@@ -755,35 +946,94 @@ msgstr "Markita per"
msgid "Could not read the image file."
msgstr "Malsukcesis lego de la bildodosiero"
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Jes, mi volas forigi ĉi tion."
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr "komentis je via afiŝo"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Oj, via komento estis malplena."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Via komento estis afiŝita!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr "Iuj dosieroj de ĉi tiu ero ŝajne mankas. Mi tamen forigas."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Vi forigis la dosieron."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "La dosiero ne estis forigita, ĉar vi ne konfirmis vian certecon per la markilo."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
index 89f60e28..b06a995e 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
+++ 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
index b86413bf..1429f887 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -5,7 +5,7 @@
# Translators:
# <deletesoftware@yandex.ru>, 2011, 2012.
# <ekenbrand@hotmail.com>, 2011.
-# <jacobo@gnu.org>, 2011, 2012.
+# <jacobo@gnu.org>, 2011-2012.
# Javier Di Mauro <javierdimauro@gmail.com>, 2011.
# <juangsub@gmail.com>, 2011.
# <juanma@kde.org.ar>, 2011, 2012.
@@ -13,20 +13,21 @@
# Mario Rodriguez <msrodriguez00@gmail.com>, 2011.
# <mu@member.fsf.org>, 2011.
# <shackra@riseup.net>, 2012.
+# <stardustprincess17@hotmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-05 10:01-0500\n"
-"PO-Revision-Date: 2012-08-11 17:17+0000\n"
-"Last-Translator: larjona <larjona99@gmail.com>\n"
+"POT-Creation-Date: 2012-09-24 11:41-0500\n"
+"PO-Revision-Date: 2012-09-24 17:10+0000\n"
+"Last-Translator: Elesa <stardustprincess17@hotmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/mediagoblin/language/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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -91,7 +92,7 @@ msgstr "Un correo electrónico ha sido enviado con instrucciones sobre cómo cam
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
-msgstr "No se pudo enviar un correo electrónico de recuperación de contraseñas porque su nombre de usuario está inactivo o la dirección de su cuenta de correo electrónico no ha sido verificada."
+msgstr "No se pudo enviar un correo electrónico de recuperación de contraseñas porque tu nombre de usuario está inactivo o la dirección de su cuenta de correo electrónico no ha sido verificada."
#: mediagoblin/auth/views.py:285
msgid "Couldn't find someone with that username or email."
@@ -101,7 +102,9 @@ msgstr "No se pudo encontrar a alguien con ese nombre de usuario o correo electr
msgid "You can now log in using your new password."
msgstr "Ahora tu puedes entrar usando tu nueva contraseña."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Título"
@@ -110,7 +113,8 @@ msgid "Description of this work"
msgstr "Descripción de esta obra"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -125,11 +129,11 @@ msgstr "Etiquetas"
msgid "Separate tags by commas."
msgstr "Separa las etiquetas por comas."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Ficha"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
@@ -162,7 +166,7 @@ msgstr "Vieja contraseña"
#: mediagoblin/edit/forms.py:64
msgid "Enter your old password to prove you own this account."
-msgstr "Escriba la anterior contraseña para demostrar la propiedad de la cuenta."
+msgstr "Escriba la anterior contraseña para demostrar que esta cuenta te pertenece."
#: mediagoblin/edit/forms.py:67
msgid "New password"
@@ -172,37 +176,65 @@ msgstr "Nueva contraseña"
msgid "Email me when others comment on my media"
msgstr "Envíame un correo cuando otros escriban comentarios sobre mi contenido"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr "El título no puede estar vacío"
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr "Descripción de esta colección"
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr "El título de la dirección de esta colección. Generalmente no necesitas cambiar esto."
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Una entrada con esa ficha ya existe para este usuario."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Estás editando el contenido de otro usuario. Proceder con precaución."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Estás editando un perfil de usuario. Proceder con precaución."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Los cambios de perfil fueron salvados"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "las configuraciones de cuenta fueron salvadas"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Contraseña incorrecta"
+#: mediagoblin/edit/views.py:287
+#, python-format
+msgid "You already have a collection called \"%s\"!title"
+msgstr "Ya tienes una colección llamada \"%s\"!title"
+
+#: mediagoblin/edit/views.py:290
+msgid "A collection with that slug already exists for this user."
+msgstr "Una colección con esa ficha ya existe para este usuario/a."
+
+#: mediagoblin/edit/views.py:307
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr "Estás editando la colección de otro usuario/a. Ten cuidado."
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
-msgstr "No puedo enlazar al tema... no hay tema seleccionado\n"
+msgstr "No se puede enlazar al tema... no hay un tema seleccionado\n"
#: mediagoblin/gmg_commands/theme.py:71
msgid "No asset directory for this theme\n"
-msgstr "No hay directorio activo para este tema\n"
+msgstr "No hay directorio activo para este tema\n\n\n"
#: mediagoblin/gmg_commands/theme.py:74
msgid "However, old link directory symlink found; removed.\n"
@@ -217,6 +249,72 @@ msgstr "Lo sentidos, No soportamos ese tipo de archivo :("
msgid "Video transcoding failed"
msgstr "Ha fallado la conversión de vídeo"
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr "ID del Cliente"
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr "Siguiente URL"
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr "Permitir"
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr "Denegar"
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr "Nombre"
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr "El nombre del cliente OAuth"
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr "Descripción"
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr "Esto será visible para los usuarios que permitan tu aplicación\n\npara que puedan autenticarse."
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr "Tipo"
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr "<strong>Confidencial</strong> - El cliente puede hacer peticiones a la instancia GNU MediaGoblin que no pueden ser interceptadas por el agente de usuario (ejemplo: un cliente del lado del servidor).<br /><strong>Público</strong> - El cliente no puede hacer peticiones confidenciales a la instancia GNU MediaGoblin (ejemplo: un cliente JavaScript del lado del servidor)."
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr "Redireccionar URI"
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr "La URI para redireccionar las aplicaciones, este campo es <strong>requerido</strong> para los clientes públicos."
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr "Este campo es requerido para los clientes públicos"
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr "¡El cliente {0} ha sido registrado!"
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Archivo inválido para el formato seleccionado."
@@ -225,27 +323,37 @@ msgstr "Archivo inválido para el formato seleccionado."
msgid "File"
msgstr "Archivo"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Debes proporcionar un archivo."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "¡Yujú! ¡Enviado!"
-#: mediagoblin/templates/mediagoblin/404.html:22
+#: mediagoblin/submit/views.py:211 mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr "¡Ya tienes una colección llamada \"%s\"!"
+
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr "¡Colección \"%s\" añadida!"
+
+#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Imagen de 404 goblin estresándose"
-#: mediagoblin/templates/mediagoblin/404.html:23
+#: mediagoblin/templates/mediagoblin/404.html:25
msgid "Oops!"
msgstr "¡Ups!"
-#: mediagoblin/templates/mediagoblin/404.html:24
+#: mediagoblin/templates/mediagoblin/404.html:26
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr "Parece no haber una página en esta dirección. ¡Lo siento!"
+msgstr "Parece no haber una página en esta dirección. ¡Lo sentimos!"
-#: mediagoblin/templates/mediagoblin/404.html:26
+#: mediagoblin/templates/mediagoblin/404.html:28
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
@@ -263,27 +371,32 @@ msgstr "¡Verifica tu email!"
msgid "+ Add media"
msgstr "+Agregar contenido"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr "+ Añadir colección"
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Ver tu perfil"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Salir "
-#: mediagoblin/templates/mediagoblin/base.html:74
-#: mediagoblin/templates/mediagoblin/auth/login.html:32
-#: mediagoblin/templates/mediagoblin/auth/login.html:50
+#: mediagoblin/templates/mediagoblin/base.html:75
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Conectarse"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
-msgstr "Potenciado por <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un proyecto <a href=\"http://gnu.org/\">GNU</a>."
+msgstr "Proveído por <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un proyecto <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -303,7 +416,7 @@ msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!"
msgid ""
"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
"extraordinarily great piece of media hosting software."
-msgstr "Este sitio está montado con <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un programa libre buenísimo para gestionar contenido multimedia."
+msgstr "Este sitio está montado con <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un extraordinario programa libre para alojar, gestionar y compartir contenido multimedia."
#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
@@ -327,58 +440,62 @@ msgstr "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Crea una
msgid "Most recent media"
msgstr "El contenido más reciente"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:22
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
msgid "Media processing panel"
msgstr "Panel de procesamiento de contenido"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:25
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
-msgstr "Aquí puede llevar un seguimiento del estado del contenido que se está procesando en esta instancia."
+msgstr "Aquí puedes llevar un seguimiento del estado del contenido que se está procesando en esta instancia."
-#: mediagoblin/templates/mediagoblin/admin/panel.html:28
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
msgid "Media in-processing"
msgstr "Procesando contenido"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:54
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:52
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
msgid "No media in-processing"
msgstr "No hay contenidos en procesamiento"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:55
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
msgid "These uploads failed to process:"
msgstr "Estos archivos no pudieron ser procesados:"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:86
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:82
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
msgid "No failed entries!"
msgstr "¡No han fallado entradas!"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:88
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
msgstr "Últimos 10 envíos con éxito"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:108
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:103
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
msgid "No processed entries, yet!"
msgstr "¡Aún no hay entradas procesadas!"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
msgstr "Coloca tu nueva contraseña "
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
msgid "Set password"
msgstr "Coloca la contraseña"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
msgid "Recover password"
msgstr "Recuperar contraseña"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
msgid "Send instructions"
msgstr "Enviar instrucciones"
@@ -394,29 +511,30 @@ msgid ""
"\n"
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
-msgstr "Hola %(username)s,\n\nPara cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n\n%(verification_url)s \n\nSi piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un trasgo feliz."
+msgstr "Hola %(username)s,\n\nPara cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n\n%(verification_url)s \n\nSi piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un duende feliz."
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
msgid "Logging in failed!"
-msgstr "¡Falló en el inicio de sesión!"
+msgstr "¡Hubo un fallo al iniciar sesión!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:40
+#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "¿No tienes una cuenta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:41
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
msgstr "¡Crea una aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:47
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
-#: mediagoblin/templates/mediagoblin/auth/register.html:32
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create an account!"
msgstr "¡Crea una cuenta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:36
+#: mediagoblin/templates/mediagoblin/auth/register.html:40
msgid "Create"
msgstr "Crear"
@@ -431,32 +549,53 @@ msgid ""
"%(verification_url)s"
msgstr "Hola %(username)s,\n\npara activar tu cuenta de GNU MediaGoblin, abre la siguiente URL en tu navegador:\n\n%(verification_url)s "
-#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr "Editando archivos adjuntos a %(media_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
#, python-format
msgid "Editing %(media_title)s"
msgstr "Editando %(media_title)s "
-#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Cancelar"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:37
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+#: mediagoblin/templates/mediagoblin/edit/edit.html:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Guardar cambios"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:41
#, python-format
msgid "Changing %(username)s's account settings"
msgstr "Cambio de %(username)s la configuración de la cuenta "
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr "Editando %(collection_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando el perfil de %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -480,14 +619,14 @@ msgid ""
"Sorry, this audio will not work because \n"
"\tyour web browser does not support HTML5 \n"
"\taudio."
-msgstr "Disculpa, este audio audio podría no funcionar porque \n\ttú explorador no soportar HTML5 \n\taudio."
+msgstr "Lo sentimos, este audio audio no funcionará porque \n\ttu navegador web no soporta audio de \n\tHTML5."
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
msgid ""
"You can get a modern web browser that \n"
"\tcan play the audio at <a href=\"http://getfirefox.com\">\n"
"\t http://getfirefox.com</a>!"
-msgstr "Tú puedes obtener un explorador más moderno que \n\tpueda reproducir el audio <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
+msgstr "Tú puedes obtener un navegador más moderno que \n\tpueda reproducir el audio <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
#: mediagoblin/templates/mediagoblin/media_displays/video.html:56
@@ -503,7 +642,7 @@ msgid ""
"Sorry, this video will not work because \n"
"\t your web browser does not support HTML5 \n"
"\t video."
-msgstr "Lo sentidos, este video no va funcionar porque\n<span class=\"whitespace other\" title=\"Tab\">»</span> Tu explorador web no soporta HTML5\n<span class=\"whitespace other\" title=\"Tab\">»</span> video."
+msgstr "Lo sentimos, este video no va funcionar porque\n<span class=\"whitespace other\" title=\"Tab\">»</span> Tu navegador web no soporta HTML5\n<span class=\"whitespace other\" title=\"Tab\">»</span> video."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:43
msgid ""
@@ -516,20 +655,75 @@ msgstr "Tú puedes conseguir un navegador web moderno que\n<span class=\"whitesp
msgid "WebM file (640p; VP8/Vorbis)"
msgstr "Archivo WebM (640p; VP8/Vorbis)"
-#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Add your media"
-msgstr "Añade tu contenido "
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr "Añadir una colección"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
msgid "Add"
msgstr "Añadir "
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr "Añade tu contenido "
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr "%(collection_title)s (%(username)s's collection)"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "%(collection_title)s por <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Borrar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr "<p>\n%(collection_description)s\n</p>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "¿Realmente deseas eliminar %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Eliminar permanentemente"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr "¿Realmente quieres quitar %(media_title)s de %(collection_title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr "Quitar"
+
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
"Hi %(username)s,\n"
"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
-msgstr "Hola %(username)s,\n%(comment_author)s escribieron comentarios sobre tu publicación (%(comment_url)s) en %(instance_name)s\n"
+msgstr "Hola %(username)s,\n%(comment_author)s comentó tu publicación (%(comment_url)s) en %(instance_name)s\n"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
#, python-format
@@ -552,14 +746,6 @@ msgstr "❖ Explorando contenido de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Image for %(media_title)s"
msgstr "Imágenes para %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Editar"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Borrar"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Añadir un comentario"
@@ -586,32 +772,36 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Añadido en</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr "Adjuntos"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr "Agregar adjunto"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "¿Realmente deseas eliminar %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr "Añadir %(title)s a la colección"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Eliminar permanentemente"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr "+"
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr "Añadir una nueva colección"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr "Puedes hacer un seguimiento del estado de tu contenido siendo procesado aquí."
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
-msgstr "Tus últimos 10 envíos con éxito"
+msgstr "Tus últimos 10 envíos exitosos"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
@@ -626,7 +816,7 @@ msgstr "Lo sentimos, no se encontró ese usuario."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "Es necesario un correo electrónico de verificación"
+msgstr "Es necesario que verifiques tu cuenta mediante el correo de notiicación"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
@@ -649,7 +839,7 @@ msgstr "Reenviar correo electrónico de verificación"
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
-msgstr "Alguien ya registró una cuenta con ese nombre de usuario, pero todavía no fue activada."
+msgstr "Alguien ya registró una cuenta con ese nombre de usuario, pero todavía no ha sido activada."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
@@ -684,17 +874,35 @@ msgstr "Ver todo el contenido de %(username)s"
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "Aquí es donde tu contenido estará, pero parece que aún no has agregado nada."
+msgstr "Aquí es donde estará ubicado tu contenido, pero parece que aún no has agregado nada."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
msgid "Add media"
msgstr "Añadir contenido"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Parece que aún no hay ningún contenido aquí..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr "<br />⏎ <a href=\"%(entry_url)s\">%(note)s</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr "En las colecciones (%(collected)s)"
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "Icono feed"
@@ -746,35 +954,94 @@ msgstr "Marcado con"
msgid "Could not read the image file."
msgstr "No se pudo leer el archivo de imagen."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Estoy seguro de que quiero borrar esto"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr "Estoy seguro/a de que quiero quitar este ítem de la colección"
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr "-- Selecciona --"
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr "Incluir una nota"
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
-msgstr "escribieron comentarios sobre tu publicación"
+msgstr "comentó tu publicación"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Ups, tu comentario estaba vacío."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "¡Tu comentario ha sido publicado!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr "Tienes que seleccionar o añadir una colección"
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr "%s\" ya está en la colección \"%s\""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr "\"%s\" añadido a la colección \"%s\""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr "Por favor, revisa tus entradas e inténtalo de nuevo."
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
-msgstr "Algunos de los ficheros en esta entrada parece que se han perdido. Borrando igualmente."
+msgstr "Al parecer algunos de los ficheros en esta entrada se han perdido. Borrando igualmente."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Eliminaste el contenido"
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "El contenido no se eliminó porque no marcaste que estabas seguro."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Estás a punto de eliminar un contenido de otro usuario. Proceder con precaución."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr "Borraste el ítem de la colección."
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr "El ítem no fue removido porque no confirmaste que estuvieras seguro/a."
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr "Estás a punto de borrar un ítem de la colección de otro usuario. Procede con cuidado."
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr "Borraste la colección \"%s\""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr "La colección no fue borrada porque no confirmaste que estuvieras seguro/a."
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr "Estás a punto de borrar la colección de otro usuario. Procede con cuidado."
diff --git a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
index ed449b8f..4996877b 100644
--- a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
index b097030a..2037f36e 100644
--- a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: fa\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "عنوان"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "برچسب"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -163,30 +166,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "شما در حال ویرایش رسانه کاربر دیگری هستید.با احتیاط عمل کنید"
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "شما در حال ویرایش نمایه کاربر دیگری هستید.با احتیاط عمل کنید."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "فایلی نا معتبر برای نوع رسانه داده شده."
@@ -216,14 +314,19 @@ msgstr "فایلی نا معتبر برای نوع رسانه داده شده."
msgid "File"
msgstr "فایل"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "شما باید فایلی ارايه بدهید."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "هورا!ثبت شد!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -254,28 +357,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "ورود"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "ویرایش %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "انصراف"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "ذخیره تغییرات"
@@ -457,12 +569,19 @@ msgstr "ذخیره تغییرات"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "در حال ویرایش نمایه %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +641,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -559,14 +732,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -593,22 +758,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -753,35 +940,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
index c49f2fc1..8262b37f 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
+++ 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
index 5c621381..560484bb 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
@@ -14,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/mediagoblin/language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -98,7 +98,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titre"
@@ -107,7 +109,8 @@ msgid "Description of this work"
msgstr "Descriptif pour ce travail"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -122,11 +125,11 @@ msgstr "Tags"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Légende"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "La légende ne peut pas être laissée vide."
@@ -169,30 +172,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Une entrée existe déjà pour cet utilisateur avec la même légende."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Vous vous apprêtez à modifier le média d'un autre utilisateur. Veuillez prendre garde."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre garde."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Mauvais mot de passe"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -214,6 +246,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Le fichier envoyé ne correspond pas au type de média."
@@ -222,14 +320,19 @@ msgstr "Le fichier envoyé ne correspond pas au type de média."
msgid "File"
msgstr "Fichier"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Il vous faut fournir un fichier."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Youhou, c'est envoyé !"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Image de 404 gobelin angoissé"
@@ -260,28 +363,32 @@ msgstr "Vérifiez votre adresse e-mail !"
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "S'identifier"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -447,12 +554,17 @@ msgid "Editing %(media_title)s"
msgstr "Modification de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Annuler"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -463,12 +575,19 @@ msgstr "Enregistrer les modifications"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Modification du profil de %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -528,13 +647,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Éditer"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Effacer"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Voulez-vous vraiment supprimer %(title)s ?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -565,14 +738,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Éditer"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Effacer"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -599,22 +764,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Voulez-vous vraiment supprimer %(title)s ?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -704,10 +873,28 @@ msgid "Add media"
msgstr "Ajouter des médias"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Il ne semble pas y avoir de média là, pour l'instant ..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "icone de flux"
@@ -759,35 +946,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Je suis sûr de vouloir supprimer cela"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Oups, votre commentaire était vide."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Votre commentaire a été posté !"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Vous avez supprimé le media."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Ce media n'a pas été supprimé car vous n'avez pas confirmer que vous étiez sur."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Vous êtes sur le point de supprimer des médias d'un autre utilisateur. Procédez avec prudence."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
index 05ae27fe..b55044f7 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
index 3cea8fc9..d16e0022 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Aleksandr Brezhnev <abrezhnev@gmail.com>, 2012.
# Emilio Sepúlveda <djfunkinmixer@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: ia\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +93,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titulo"
@@ -101,7 +104,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -110,17 +114,17 @@ msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
msgid "Tags"
-msgstr ""
+msgstr "Etiquettas"
#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -163,30 +167,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,22 +241,93 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
#: mediagoblin/submit/forms.py:26
msgid "File"
-msgstr ""
+msgstr "File"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -254,28 +358,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Initiar session"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Cancellar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr ""
@@ -457,12 +570,19 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +642,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -559,14 +733,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -593,22 +759,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -698,10 +868,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -753,35 +941,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
index b2e9f988..5658950c 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
index 16ecd20c..fd04ba6e 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
@@ -6,12 +6,13 @@
# Francesco Apruzzese <cescoap@gmail.com>, 2012.
# <pikappa469@alice.it>, 2011.
# <robi@nunnisoft.ch>, 2011.
+# <sun_lion@live.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,7 +20,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: it\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -35,7 +36,7 @@ msgstr "Indirizzo email"
#: mediagoblin/auth/forms.py:51
msgid "Username or email"
-msgstr ""
+msgstr "Nome utente o indirizzo email"
#: mediagoblin/auth/forms.py:58
msgid "Incorrect input"
@@ -43,11 +44,11 @@ msgstr ""
#: mediagoblin/auth/views.py:55
msgid "Sorry, registration is disabled on this instance."
-msgstr "Spiacente, registrazione è disabilitata su questa istanza"
+msgstr "Spiacente, la registrazione è disabilitata su questa istanza."
#: mediagoblin/auth/views.py:75
msgid "Sorry, a user with that name already exists."
-msgstr "Spiacente, esiste già un utente con quel nome"
+msgstr "Spiacente, esiste già un utente con quel nome."
#: mediagoblin/auth/views.py:79
msgid "Sorry, a user with that email address already exists."
@@ -57,7 +58,7 @@ msgstr "Siamo spiacenti, un utente con quell'indirizzo email esiste già."
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
-msgstr "Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare il tuo profilo, e inserire immagini!"
+msgstr "Il tuo indirizzo email è stato verificato. Ora puoi accedere, modificare il tuo profilo e caricare immagini!"
#: mediagoblin/auth/views.py:188
msgid "The verification key or user id is incorrect"
@@ -65,7 +66,7 @@ msgstr "La chiave di verifica o l'id utente è sbagliato"
#: mediagoblin/auth/views.py:206
msgid "You must be logged in so we know who to send the email to!"
-msgstr "Devi entrare col tuo profilo così possiamo sapere a chi inviare l'email!"
+msgstr "Devi effettuare l'accesso così possiamo sapere a chi inviare l'email!"
#: mediagoblin/auth/views.py:214
msgid "You've already verified your email address!"
@@ -84,17 +85,19 @@ msgstr "Ti è stata inviata un'email con le istruzioni per cambiare la tua passw
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
-msgstr "Impossibile inviare l'email di recupero password perchè il tuo nome utente è inattivo o il tuo account email non è stato verificato."
+msgstr "Impossibile inviare l'email di recupero password perchè il tuo nome utente è inattivo o il tuo indirizzo email non è stato verificato."
#: mediagoblin/auth/views.py:285
msgid "Couldn't find someone with that username or email."
-msgstr "Impossibile trovare qualcuno con questo username o password."
+msgstr "Impossibile trovare qualcuno con questo nome utente o password."
#: mediagoblin/auth/views.py:333
msgid "You can now log in using your new password."
-msgstr "Ora puoi effettuare il login con la nuova password."
+msgstr "Ora puoi effettuare l'accesso con la nuova password."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titolo"
@@ -103,12 +106,13 @@ msgid "Description of this work"
msgstr "Descrizione di questo lavoro"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
-msgstr ""
+msgstr "Puoi usare il\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> per la formattazione."
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
msgid "Tags"
@@ -118,11 +122,11 @@ msgstr "Tags"
msgid "Separate tags by commas."
msgstr "Separa le tags con la virgola."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -130,7 +134,7 @@ msgstr ""
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
-msgstr "Il titolo è parte dell'indirizzo del contenuto. Nella maggior parte dei casi non c'è bisogno di cambiarlo."
+msgstr "Il titolo è parte dell'indirizzo del file. Nella maggior parte dei casi non c'è bisogno di cambiarlo."
#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
@@ -139,7 +143,7 @@ msgstr "Licenza"
#: mediagoblin/edit/forms.py:50
msgid "Bio"
-msgstr "Bio"
+msgstr "Biografia"
#: mediagoblin/edit/forms.py:56
msgid "Website"
@@ -147,7 +151,7 @@ msgstr "Sito web"
#: mediagoblin/edit/forms.py:58
msgid "This address contains errors"
-msgstr ""
+msgstr "Questo indirizzo contiene errori"
#: mediagoblin/edit/forms.py:63
msgid "Old password"
@@ -163,32 +167,61 @@ msgstr "Nuova password"
#: mediagoblin/edit/forms.py:72
msgid "Email me when others comment on my media"
+msgstr "Inviami messaggi email quando altre persone commentano i miei files multimediali"
+
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
-msgstr "Stai modificando documenti multimediale di un altro utente. Procedi con attenzione."
+msgstr "Stai modificando files multimediali di un altro utente. Procedi con attenzione."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Stai modificando il profilo di un utente. Procedi con attenzione."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Cambiamenti del profilo salvati"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Impostazioni del profilo salvate"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Password errata"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,23 +241,94 @@ msgstr "Mi dispiace, non supporto questo tipo di file :("
#: mediagoblin/media_types/video/processing.py:35
msgid "Video transcoding failed"
+msgstr "Transcodifica video fallita"
+
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
msgstr ""
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
-msgstr "documento non valido come tipo multimediale."
+msgstr "File non valido per il tipo di file multimediale indicato."
#: mediagoblin/submit/forms.py:26
msgid "File"
-msgstr "Documento"
+msgstr "File"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
-msgstr "Devi specificare un documento."
+msgstr "Devi specificare un file."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
-msgstr "Evviva! "
+msgstr "Evviva! Caricato!"
+
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
@@ -246,7 +350,7 @@ msgstr "Se sei sicuro che l'indirizzo è corretto, forse la pagina che stai cerc
#: mediagoblin/templates/mediagoblin/base.html:50
msgid "MediaGoblin logo"
-msgstr "MediaGoblin logo"
+msgstr "Simbolo di MediaGoblin"
#: mediagoblin/templates/mediagoblin/base.html:60
msgid "Verify your email!"
@@ -254,36 +358,40 @@ msgstr "Verifica la tua email!"
#: mediagoblin/templates/mediagoblin/base.html:66
msgid "+ Add media"
-msgstr ""
+msgstr "+ Aggiungi files multimediali"
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr "Vedi il tuo profilo"
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
-msgstr ""
+msgstr "Esci"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Accedi"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
-msgstr ""
+msgstr "Realizzato con <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un progetto <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
"href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a "
"href=\"%(source_link)s\">Source code</a> available."
-msgstr ""
+msgstr "Rilasciato con licenza <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a href=\"%(source_link)s\">Codice sorgente</a> disponibile."
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
@@ -291,19 +399,19 @@ msgstr "Esplora"
#: mediagoblin/templates/mediagoblin/root.html:26
msgid "Hi there, welcome to this MediaGoblin site!"
-msgstr "Ciao, benvenuto a questo sito MediaGoblin!"
+msgstr "Ciao, benvenuto in questo sito MediaGoblin!"
#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
"extraordinarily great piece of media hosting software."
-msgstr "questo sito sta utilizzando <a href=\"http://mediagoblin.org\">Mediagoblin</a>, un ottimo programma di media hosting."
+msgstr "Questo sito sta utilizzando <a href=\"http://mediagoblin.org\">Mediagoblin</a>, un ottimo programma per caricare e condividere files multimediali."
#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
-msgstr ""
+msgstr "Per aggiungere i tuoi file multimediali, scrivere commenti e altro puoi accedere con il tuo account MediaGoblin."
#: mediagoblin/templates/mediagoblin/root.html:31
msgid "Don't have one yet? It's easy!"
@@ -315,38 +423,38 @@ msgid ""
"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
-msgstr ""
+msgstr "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Crea un account in questo sito</a>\n oppure\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installa MediaGoblin sul tuo server</a>"
#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
-msgstr "Documenti multimediali più recenti"
+msgstr "Files multimediali più recenti"
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
msgid "Media processing panel"
-msgstr "Pannello di elaborazione media"
+msgstr "Pannello di elaborazione files multimediali"
#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
-msgstr ""
+msgstr "Qui è possibile tenere traccia dello stato dei file multimediali in fase di elaborazione in questa istanza."
#: mediagoblin/templates/mediagoblin/admin/panel.html:32
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
msgid "Media in-processing"
-msgstr "Media in elaborazione"
+msgstr "Files multimediali in elaborazione"
#: mediagoblin/templates/mediagoblin/admin/panel.html:58
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
msgid "No media in-processing"
-msgstr "Nessun documento multimediale in elaborazione"
+msgstr "Nessun file multimediale in elaborazione"
#: mediagoblin/templates/mediagoblin/admin/panel.html:61
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
msgid "These uploads failed to process:"
-msgstr "L'elaborazione di questi upload è fallita:"
+msgstr "L'elaborazione di questi files caricati è fallita:"
#: mediagoblin/templates/mediagoblin/admin/panel.html:90
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
@@ -355,7 +463,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
-msgstr ""
+msgstr "Ultimi 10 caricamenti riusciti"
#: mediagoblin/templates/mediagoblin/admin/panel.html:112
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
@@ -392,7 +500,7 @@ msgid ""
"\n"
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
-msgstr "Ciao %(username)s,\nper cambiare la tua password MediaGoblin apri il seguente URL\nnel tuo web browser:\n\n%(verification_url)s\n\nSe pensi che sia un errore, ignora semplicemente questa email e continua ad essere \nun goblin felice!"
+msgstr "Ciao %(username)s,\n\nper cambiare la tua password MediaGoblin apri il seguente URL nel\ntuo browser web:\n\n%(verification_url)s\n\nSe pensi che questo sia un errore, ignora semplicemente questa email e continua ad essere \nun goblin felice!"
#: mediagoblin/templates/mediagoblin/auth/login.html:39
msgid "Logging in failed!"
@@ -408,7 +516,7 @@ msgstr "Creane uno qui!"
#: mediagoblin/templates/mediagoblin/auth/login.html:51
msgid "Forgot your password?"
-msgstr "Hai dimenticato la password?"
+msgstr "Hai dimenticato la tua password?"
#: mediagoblin/templates/mediagoblin/auth/register.html:28
#: mediagoblin/templates/mediagoblin/auth/register.html:36
@@ -428,13 +536,13 @@ msgid ""
"your web browser:\n"
"\n"
"%(verification_url)s"
-msgstr "Ciao %(username)s,\n\nper attivare il tuo account GNU MediaGoblin, apri il seguente URL nel tuo navigatore web.\n\n%(verification_url)s"
+msgstr "Ciao %(username)s,\n\nper attivare il tuo account GNU MediaGoblin, apri il seguente URL nel \ntuo navigatore web.\n\n%(verification_url)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
#, python-format
msgid "Editing attachments for %(media_title)s"
-msgstr ""
+msgstr "Stai modificando gli allegati di %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:23
#: mediagoblin/templates/mediagoblin/edit/edit.html:35
@@ -443,12 +551,17 @@ msgid "Editing %(media_title)s"
msgstr "Stai modificando %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Annulla"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Salva i cambiamenti"
@@ -457,7 +570,12 @@ msgstr "Salva i cambiamenti"
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:41
#, python-format
msgid "Changing %(username)s's account settings"
-msgstr "Cambio le impostazione dell'account %(username)s"
+msgstr "Stai cambiando le impostazioni dell'account di %(username)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
@@ -465,18 +583,20 @@ msgstr "Cambio le impostazione dell'account %(username)s"
msgid "Editing %(username)s's profile"
msgstr "Stai modificando il profilo di %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
msgid "Media tagged with: %(tag_name)s"
-msgstr "file taggato con:%(tag_name)s"
+msgstr "File taggato con: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
#: mediagoblin/templates/mediagoblin/media_displays/image.html:23
#: mediagoblin/templates/mediagoblin/media_displays/video.html:52
msgid "Download"
-msgstr ""
+msgstr "Scarica"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:38
#: mediagoblin/templates/mediagoblin/media_displays/image.html:27
@@ -488,72 +608,126 @@ msgid ""
"Sorry, this audio will not work because \n"
"\tyour web browser does not support HTML5 \n"
"\taudio."
-msgstr ""
+msgstr "Spiacente ma è impossibile leggere questo file audio perché\n\til tuo browser web non supporta l'HTML5 \n\taudio."
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
msgid ""
"You can get a modern web browser that \n"
"\tcan play the audio at <a href=\"http://getfirefox.com\">\n"
"\t http://getfirefox.com</a>!"
-msgstr ""
+msgstr "Puoi scaricare un browser web moderno,\n\t in grado di leggere questo file audio, qui <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
#: mediagoblin/templates/mediagoblin/media_displays/video.html:56
msgid "Original file"
-msgstr ""
+msgstr "File originario"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
msgid "WebM file (Vorbis codec)"
-msgstr ""
+msgstr "File WebM (codec Vorbis)"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:40
msgid ""
"Sorry, this video will not work because \n"
"\t your web browser does not support HTML5 \n"
"\t video."
-msgstr ""
+msgstr "Spiacente ma è impossibile visualizzare questo video perché\n\t il tuo browser web non supporta l'HTML5 \n\t video."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:43
msgid ""
"You can get a modern web browser that \n"
"\t can play this video at <a href=\"http://getfirefox.com\">\n"
"\t http://getfirefox.com</a>!"
-msgstr ""
+msgstr "Puoi scaricare un browser web moderno,\n\t in grado di visualizzare questo video, qui <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:59
msgid "WebM file (640p; VP8/Vorbis)"
+msgstr "File WebM (640p; VP8/Vorbis)"
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Aggiungi"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
-msgstr "Aggiungi il tuo contenuto"
+msgstr "Aggiungi il tuo file multimediale"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Aggiungi"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Modifica"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Elimina"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Vuoi davvero eliminare %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Elimina definitivamente"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
"Hi %(username)s,\n"
"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
-msgstr ""
+msgstr "Ciao %(username)s,\n%(comment_author)s ha commentato il tuo post (%(comment_url)s) su %(instance_name)s\n"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
#, python-format
msgid "%(username)s's media"
-msgstr "file di %(username)s"
+msgstr "Files multimediali di %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-msgstr "Documenti multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "Files multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
#: mediagoblin/templates/mediagoblin/user_pages/media.html:46
#, python-format
msgid "❖ Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
-msgstr ""
+msgstr "❖ Stai guardando i files multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
@@ -561,24 +735,16 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Modifica"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Elimina"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
-msgstr ""
+msgstr "Aggiungi un commento"
#: mediagoblin/templates/mediagoblin/user_pages/media.html:109
msgid ""
"You can use <a "
"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
" formatting."
-msgstr ""
+msgstr "Puoi usare il <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> per la formattazione."
#: mediagoblin/templates/mediagoblin/user_pages/media.html:113
msgid "Add this comment"
@@ -593,34 +759,38 @@ msgstr "a"
msgid ""
"<h3>Added on</h3>\n"
" <p>%(date)s</p>"
-msgstr ""
+msgstr "<h3>Aggiunto il</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
-msgstr ""
+msgstr "Allegati"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
-msgstr ""
+msgstr "Aggiungi allegato"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Vuoi davvero cancellare %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
"You can track the state of media being processed for your gallery here."
-msgstr "Puoi seguire lo stato dell'elaborazione per la tua galleria qui."
+msgstr "Puoi controllare lo stato dei files multimediali in elaborazione per la tua galleria qui."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
-msgstr ""
+msgstr "I tuoi ultimi 10 caricamenti riusciti"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
@@ -630,12 +800,12 @@ msgstr "profilo di %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
msgid "Sorry, no such user found."
-msgstr "Mi dispiace, utente non trovato"
+msgstr "Mi dispiace, utente non trovato."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "è necessario verificare email"
+msgstr "E' necessario verificare l'indirizzo email"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
@@ -665,7 +835,7 @@ msgstr "Qualcuno ha registrato un account con questo nome utente, ma deve ancora
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 sei quella persona ma hai perso l'email di verifica, puoi <a href=\"%(login_url)s\">accedere</a> e rispedirlo."
+msgstr "Se sei quella persona ma hai perso l'email di verifica, puoi <a href=\"%(login_url)s\">accedere</a> e rispedirla."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
@@ -687,22 +857,40 @@ msgstr "Cambia le impostazioni dell'account"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
-msgstr "Visualizza tutti i file multimediali di %(username)s"
+msgstr "Visualizza tutti i files multimediali di %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu non abbia ancora aggiunto niente."
+msgstr "Qui è dove appariranno i tuoi files multimediali, ma sembra che tu non abbia ancora aggiunto niente."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
msgid "Add media"
-msgstr "Aggiungi documenti multimediali"
+msgstr "Aggiungi files multimediali"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
-msgstr "Non sembra ci sia ancora nessun documento multimediali qui.."
+msgstr "Sembra che non ci sia ancora nessun file multimediale qui..."
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -714,12 +902,12 @@ msgstr "Atom feed"
#: mediagoblin/templates/mediagoblin/utils/geolocation_map.html:25
msgid "Location"
-msgstr ""
+msgstr "Posizione"
#: mediagoblin/templates/mediagoblin/utils/geolocation_map.html:38
#, python-format
msgid "View on <a href=\"%(osm_url)s\">OpenStreetMap</a>"
-msgstr ""
+msgstr "Visualizza su <a href=\"%(osm_url)s\">OpenStreetMap</a>"
#: mediagoblin/templates/mediagoblin/utils/license.html:25
msgid "All rights reserved"
@@ -749,41 +937,100 @@ msgstr "più vecchio"
#: mediagoblin/templates/mediagoblin/utils/tags.html:20
msgid "Tagged with"
-msgstr ""
+msgstr "Taggato con"
#: mediagoblin/tools/exif.py:78
msgid "Could not read the image file."
-msgstr "Non è possibile leggere il file dell'immagine"
+msgstr "Impossibile leggere il file immagine."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
-msgstr "Sono sicuro di volerlo cancellare"
+msgstr "Sono sicuro di volerlo eliminare"
+
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
-msgstr ""
+msgstr "ha commentato il tuo post"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Oops, il tuo commento era vuoto."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Il tuo commento è stato aggiunto!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
-msgstr "Hai cancellato il file"
+msgstr "Hai eliminato il file."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Il file non è stato eliminato perchè non hai confermato di essere sicuro."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr "Stai cancellando un documento multimediale di un altro utente. Procedi con attenzione."
+msgstr "Stai eliminando un file multimediale di un altro utente. Procedi con attenzione."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
index 2177b7dd..fc0bba8f 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
index a6207eca..5fb16241 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: ja\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "タイトル"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "タグ"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "スラグ"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "スラグは必要です。"
@@ -163,30 +166,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "そのスラグを持つエントリは、このユーザーは既に存在します。"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "あなたは、他のユーザーのメディアを編集しています。ご注意ください。"
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "あなたは、他のユーザーのプロファイルを編集しています。ご注意ください。"
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -216,14 +314,19 @@ msgstr ""
msgid "File"
msgstr "ファイル"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "ファイルを提供する必要があります。"
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "投稿終了!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -254,28 +357,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "ログイン"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "%(media_title)sを編集中"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "キャンセル"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "投稿する"
@@ -457,12 +569,19 @@ msgstr "投稿する"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)sさんのプロフィールを編集中"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +641,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -559,14 +732,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -593,22 +758,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -753,35 +940,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
index 0371863b..c141e456 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
index 16ddef8a..3b0cf98e 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: nl\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr "Kon niemand vinden met die gebruikersnaam of dat e-mailadres."
msgid "You can now log in using your new password."
msgstr "Je kunt nu inloggen met je nieuwe wachtwoord."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titel"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "Beschrijving van dit werk"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Etiket"
msgid "Separate tags by commas."
msgstr "Hou labels gescheiden met komma's."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Slug"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "De slug kan niet leeg zijn"
@@ -164,30 +167,59 @@ msgstr "Nieuw wachtwoord"
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Er bestaat al een met die slug voor deze gebruiker."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "U bent de media van een andere gebruiker aan het aanpassen. Ga voorzichtig te werk."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Profielaanpassingen opgeslagen"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Accountinstellingen opgeslagen"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Verkeerd wachtwoord"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr "Sorry, dat bestandstype wordt niet ondersteunt."
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Verkeerd bestandsformaat voor mediatype opgegeven."
@@ -217,14 +315,19 @@ msgstr "Verkeerd bestandsformaat voor mediatype opgegeven."
msgid "File"
msgstr "Bestand"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "U moet een bestand aangeven."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Mooizo! Toegevoegd!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Afbeelding van de 404 goblin onder stress"
@@ -255,28 +358,32 @@ msgstr "Verifieer je e-mailadres!"
msgid "+ Add media"
msgstr "+ Media toevoegen"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Profiel weergeven"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Afmelden"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Inloggen"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Hier draait <a href=\"http://mediagoblin.org\">MediaGoblin</a>, een <a href=\"http://gnu.org/\">GNU</a> project."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "%(media_title)s aanpassen"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Annuleren"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Wijzigingen opslaan"
@@ -458,12 +570,19 @@ msgstr "Wijzigingen opslaan"
msgid "Changing %(username)s's account settings"
msgstr "%(username)ss accountinstellingen aanpassen"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Het profiel aanpassen van %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,14 +642,68 @@ msgstr "Je kunt een moderne webbrowser die deze video af kan spelen krijgen op <
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Voeg toe"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Voeg toe"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Pas aan"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Zeker weten dat je %(title)s wil verwijderen?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Permanent verwijderen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -560,14 +733,6 @@ msgstr "❖ Blader door media van <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Image for %(media_title)s"
msgstr "Afbeelding voor %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Pas aan"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Verwijderen"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Geef een reactie"
@@ -594,23 +759,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Toegevoegd op</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Zeker weten dat je %(title)s wil verwijderen?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Permanent verwijderen"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "Voeg media toe"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Het lijkt erop dat er nog geen media is."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "feed icoon"
@@ -754,35 +941,94 @@ msgstr "Getagged met"
msgid "Could not read the image file."
msgstr "Kon het afbeeldingsbestand niet lezen."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Ik weet zeker dat ik dit wil verwijderen."
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Oeps, je bericht was leeg."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Je bericht is geplaatst!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Je hebt deze media verwijderd."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Deze media was niet verwijderd omdat je niet hebt aangegeven dat je het zeker weet."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Je staat op het punt de media van iemand anders te verwijderen. Pas op."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
index 08cd84f3..986475ba 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
+++ 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
index 3e37f34d..4156c07b 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/mediagoblin/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: nn_NO\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr "Fann ingen med det brukarnamnet eller passordet."
msgid "You can now log in using your new password."
msgstr "Du kan no logga inn med det nye passordet ditt."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Tittel"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr "Skildring av mediefila"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "Merkelappar"
msgid "Separate tags by commas."
msgstr "Separer merkelappar med komma."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Nettnamn"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Nettnamnet kan ikkje vera tomt"
@@ -163,30 +166,59 @@ msgstr "Nytt passord"
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Eit innlegg med denne adressetittelen finst allereie."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sine mediefiler."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sin profil."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Lagra endring av profilen"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Lagra kontoinstellingar"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Feil passord"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr "Orsak, stør ikkje den filtypen :("
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Ugyldig fil for mediatypen."
@@ -216,14 +314,19 @@ msgstr "Ugyldig fil for mediatypen."
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Du må velja ei fil."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Johoo! Opplasta!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Bilete av stressa 404-tusse."
@@ -254,28 +357,32 @@ msgstr "Verifiser epostadressa di."
msgid "+ Add media"
msgstr "+ Legg til medie"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Sjå profilen din"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Logg ut"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Logg inn"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Drive av <a href=\"http://mediagoblin.org\">MediaGoblin</a>, eit <a href=\"http://gnu.org/\">GNU</a>-prosjekt."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "Endrar %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Bryt av"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Lagra"
@@ -457,12 +569,19 @@ msgstr "Lagra"
msgid "Changing %(username)s's account settings"
msgstr "Endrar kontoinnstellingane til %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Endrar profilen til %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,14 +641,68 @@ msgstr "Du kan skaffa ein moderne netlesar som kan spela av denne videoen hjå <
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Legg til"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Legg til mediefiler"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Legg til"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Endra"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Slett"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Vil du verkeleg sletta %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Slett permanent"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -559,14 +732,6 @@ msgstr "❖ Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Image for %(media_title)s"
msgstr "Bilete for %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Endra"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Slett"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Legg att innspel"
@@ -593,23 +758,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Lagt til</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Vil du verkeleg sletta %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Slett permanent"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr "Legg til mediefiler"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr " "
@@ -753,35 +940,94 @@ msgstr "Merka med"
msgid "Could not read the image file."
msgstr "Klarte ikkje lesa biletefila."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Eg er sikker eg vil sletta dette"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Vops, innspelet ditt var tomt."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Innspelet ditt er lagt til."
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Du sletta fila."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Sletta ikkje fila fordi du ikkje sa du var sikker."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du er i ferd med å sletta ein annan brukar sine mediefiler. Trå varsamt."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
index 41738dfc..77dcfe12 100644
--- a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
index 4ba30d38..7dea3837 100644
--- a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: pl\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr "Nie znaleziono nikogo o takiej nazwie użytkownika lub adresie e-mail."
msgid "You can now log in using your new password."
msgstr "Teraz możesz się zalogować używając nowe hasło."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Tytuł"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr "Opis tej pracy"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "Znaczniki"
msgid "Separate tags by commas."
msgstr "Rozdzielaj znaczniki przecinkami."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Slug"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Slug nie może być pusty"
@@ -161,43 +164,72 @@ msgstr "Nowe hasło"
#: mediagoblin/edit/forms.py:72
msgid "Email me when others comment on my media"
-msgstr ""
+msgstr "Powiadamiaj mnie e-mailem o komentarzach do moich mediów"
+
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr "Tytuł nie może być pusty"
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr "Opis tej kolekcji"
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr "Część adresu zawierająca tytuł. Zwykle nie musisz tego zmieniać."
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Adres z tym slugiem dla tego użytkownika już istnieje."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Edytujesz media innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Edytujesz profil innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Zapisano zmiany profilu"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Zapisano ustawienia konta"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Nieprawidłowe hasło"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr "Kolekcja \"%s\" już istnieje!"
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr "Kolekcja tego użytkownika z takim slugiem już istnieje."
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr "Edytujesz kolekcję innego użytkownika. Zachowaj ostrożność."
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
-msgstr ""
+msgstr "Nie można podlinkować motywu... nie wybrano motywu\n"
#: mediagoblin/gmg_commands/theme.py:71
msgid "No asset directory for this theme\n"
-msgstr ""
+msgstr "Brak katalogu danych dla tego motywu\n"
#: mediagoblin/gmg_commands/theme.py:74
msgid "However, old link directory symlink found; removed.\n"
-msgstr ""
+msgstr "Znaleziono stary odnośnik symboliczny do katalogu; usunięto.\n"
#: mediagoblin/media_types/__init__.py:60
#: mediagoblin/media_types/__init__.py:120
@@ -206,8 +238,74 @@ msgstr "NIestety, nie obsługujemy tego typu plików :-("
#: mediagoblin/media_types/video/processing.py:35
msgid "Video transcoding failed"
+msgstr "Konwersja wideo nie powiodła się"
+
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr "Client ID"
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr "Następny adres URL"
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr "Zezwól"
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr "Odrzuć"
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr "Nazwa"
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr "Nazwa klienta OAuth"
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr "Opis"
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr "Typ"
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr "<strong>Confidential</strong> - Klient może wysyłać żądania\n do instancji GNU MediaGoblin, która nie może zostać\n przechwycona przez agenta (np. klient po stronie serwera).<br />\n <strong>Public</strong> - Klient nie może wysyłać poufnych\n żądań do instakcji GNU MediaGoblin (np. skrypt JavaScript\n po stronie klienta)."
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr "Przekierowanie URI"
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr "Przekierowanie URI dla aplikacji, to pole\n jest <strong>wymagane</strong> dla publicznych klientów."
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr "To pole jest wymagane dla klientów publicznych"
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr "Klient {0} został zarejestrowany!"
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Niewłaściwy plik dla tego rodzaju mediów."
@@ -216,14 +314,19 @@ msgstr "Niewłaściwy plik dla tego rodzaju mediów."
msgid "File"
msgstr "Plik"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Musisz podać plik."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Hura! Wysłano!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr "Kolekcja \"%s\" została dodana!"
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Grafika zestresowanego goblina 404."
@@ -254,28 +357,32 @@ msgstr "Zweryfikuj swój adres e-mail!"
msgid "+ Add media"
msgstr "+ Dodaj media"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr "+ Dodaj kolekcję"
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Zobacz swój profil"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Wyloguj się"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Zaloguj się"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Obsługiwane przez <a href=\"http://mediagoblin.org\">MediaGoblin</a>, projekt <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -301,7 +408,7 @@ msgstr "Ten serwis działa w oparciu o <a href=\"http://mediagoblin.org\">MediaG
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
-msgstr ""
+msgstr "Aby dodawać swoje pliki, komentować i wykonywać inne czynności, możesz się zalogować na swoje konto MediaGoblin."
#: mediagoblin/templates/mediagoblin/root.html:31
msgid "Don't have one yet? It's easy!"
@@ -329,7 +436,7 @@ msgstr "Panel przetwarzania mediów"
#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
-msgstr ""
+msgstr "Tu możesz śledzić stan przetwarzania mediów na tym serwerze."
#: mediagoblin/templates/mediagoblin/admin/panel.html:32
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
@@ -349,16 +456,16 @@ msgstr "NIe udało się przesłać tych plików:"
#: mediagoblin/templates/mediagoblin/admin/panel.html:90
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
msgid "No failed entries!"
-msgstr ""
+msgstr "Brak nieprzetworzonych wpisów!"
#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
-msgstr ""
+msgstr "Ostatnie 10 udanych wysyłek"
#: mediagoblin/templates/mediagoblin/admin/panel.html:112
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
msgid "No processed entries, yet!"
-msgstr ""
+msgstr "Na razie nie przetworzono żadnego wpisu!"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
@@ -432,7 +539,7 @@ msgstr "Cześć %(username)s,\n\naby aktywować twoje konto GNU MediaGoblin, otw
#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
#, python-format
msgid "Editing attachments for %(media_title)s"
-msgstr ""
+msgstr "Edycja załączników do %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:23
#: mediagoblin/templates/mediagoblin/edit/edit.html:35
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "Edytowanie %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Anuluj"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Zapisz zmiany"
@@ -457,12 +569,19 @@ msgstr "Zapisz zmiany"
msgid "Changing %(username)s's account settings"
msgstr "Zmiana ustawień konta %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr "Edycja %(collection_title)s"
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Edycja profilu %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -498,7 +617,7 @@ msgstr "Proszę pobrać przeglądarkę, która obsługuje \n\tdźwięk w HTML5,
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
#: mediagoblin/templates/mediagoblin/media_displays/video.html:56
msgid "Original file"
-msgstr ""
+msgstr "Oryginalny plik"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
msgid "WebM file (Vorbis codec)"
@@ -520,23 +639,77 @@ msgstr "Możesz pobrać współczesną przeglądarkę, która obsługuje \n\t
#: mediagoblin/templates/mediagoblin/media_displays/video.html:59
msgid "WebM file (640p; VP8/Vorbis)"
-msgstr ""
+msgstr "plik WebM (640p; VP8/Vorbis)"
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr "Dodaj kolekcję"
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Dodaj"
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Dodaj swoje media"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Dodaj"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr "%(collection_title)s (kolekcja użytkownika %(username)s)"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "%(collection_title)s użytkownika <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Edytuj"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Usuń"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr "<p>\n %(collection_description)s\n </p>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Na pewno usunąć %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Usuń na stałe"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr "Na pewno usunąć %(media_title)s z %(collection_title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr "Usuń"
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
"Hi %(username)s,\n"
"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
-msgstr ""
+msgstr "Witaj %(username)s,\n%(comment_author)s skomentował twój wpis (%(comment_url)s) na %(instance_name)s\n"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
#, python-format
@@ -559,14 +732,6 @@ msgstr "❖ Przeglądanie mediów użytkownika <a href=\"%(user_url)s\">%(userna
msgid "Image for %(media_title)s"
msgstr "Grafika dla %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Edytuj"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Usuń"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Dodaj komentarz"
@@ -593,23 +758,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Dodane</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
-msgstr ""
+msgstr "Załączniki"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
-msgstr ""
+msgstr "Dodaj załącznik"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Na pewno usunąć %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr "Dodaj %(title)s do kolekcji"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Usuń na stałe"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr "+"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr "Dodaj nową kolekcję"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -618,7 +787,7 @@ msgstr "Tutaj możesz śledzić stan mediów przesyłanych do twojej galerii."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
-msgstr ""
+msgstr "Ostatnie 10 twoich udanych wysyłek"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr "Dodaj media"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Tu nie ma jeszcze żadnych mediów..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr "<br />\n <a href=\"%(entry_url)s\">%(note)s</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr "<br /><a href=\"%(remove_url)s\" class=\"remove\">(usuń)</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr "W kolekcjach (%(collected)s)"
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "ikona kanału"
@@ -753,35 +940,94 @@ msgstr "Znaczniki:"
msgid "Could not read the image file."
msgstr "Nie udało się odczytać pliku grafiki."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Na pewno chcę to usunąć"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr "Na pewno chcę usunąć ten element z kolekcji"
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr "-- wybierz --"
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr "Dodaj notatkę"
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
-msgstr ""
+msgstr "komentarze do twojego wpisu"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Ups, twój komentarz nie zawierał treści."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Twój komentarz został opublikowany!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr "Musisz wybrać lub dodać kolekcję"
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr "\"%s\" już obecne w kolekcji \"%s\""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr "\"%s\" dodano do kolekcji \"%s\""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr "Sprawdź swoje wpisy i spróbuj ponownie."
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
-msgstr ""
+msgstr "Część plików z tego wpisu wygląda na nieistniejące. Trwa usuwanie."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Media zostały usunięte."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Media nie zostały usunięte ponieważ nie potwierdziłeś, że jesteś pewien."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Za chwilę usuniesz media innego użytkownika. Zachowaj ostrożność."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr "Element został usunięty z kolekcji."
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr "Ten element nie został usunięty, ponieważ nie zaznaczono, że jesteś pewien."
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr "Zamierzasz usunąć element z kolekcji innego użytkownika. Zachowaj ostrożność."
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr "Usunięto kolekcję \"%s\""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr "Ta kolekcja nie została usunięta, ponieważ nie zaznaczono, że jesteś pewien."
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr "Zamierzasz usunąć kolekcję innego użytkownika. Zachowaj ostrożność."
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
index 214da6ba..1552ce78 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
+++ 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
index fcca26b3..ff431932 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/mediagoblin/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: pt_BR\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Título"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "Descrição desse trabalho"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Etiquetas"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Arquivo"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "O arquivo não pode estar vazio"
@@ -164,30 +167,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Uma entrada com esse arquivo já existe para esse usuário"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Você está editando a mídia de outro usuário. Tenha cuidado."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Você está editando um perfil de usuário. Tenha cuidado."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Senha errada"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Arquivo inválido para esse tipo de mídia"
@@ -217,14 +315,19 @@ msgstr "Arquivo inválido para esse tipo de mídia"
msgid "File"
msgstr "Arquivo"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Você deve fornecer um arquivo."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Eba! Enviado!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Imagem do goblin 404 aparecendo"
@@ -255,28 +358,32 @@ msgstr "Verifique seu email!"
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Entrar"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "Editando %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Salvar mudanças"
@@ -458,12 +570,19 @@ msgstr "Salvar mudanças"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando perfil de %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,13 +642,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Apagar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Realmente apagar %(title)s ?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -560,14 +733,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Editar"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Apagar"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -594,22 +759,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Realmente apagar %(title)s ?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "Adicionar mídia"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Aparentemente não há nenhuma mídia aqui ainda..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "ícone feed"
@@ -754,35 +941,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Eu tenho certeza de que quero pagar isso"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Opa, seu comentáio estava vazio."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Seu comentário foi postado!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Você deletou a mídia."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Você vai apagar uma mídia de outro usuário. Tenha cuidado."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
index 0f8a186f..8a759873 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
+++ 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
index 4bc2f413..e391869b 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -4,21 +4,21 @@
#
# Translators:
# <gapop@hotmail.com>, 2011.
-# George Pop <gapop@hotmail.com>, 2011, 2012.
+# George Pop <gapop@hotmail.com>, 2011-2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-05 10:01-0500\n"
-"PO-Revision-Date: 2012-08-05 15:42+0000\n"
-"Last-Translator: George Pop <gapop@hotmail.com>\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Romanian (http://www.transifex.com/projects/p/mediagoblin/language/ro/)\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"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr "Nu s-a găsit nicio persoană cu acel nume de utilizator sau adresă de
msgid "You can now log in using your new password."
msgstr "Acum te poți autentifica cu noua parolă."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titlu"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "Descrierea acestui fișier"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Tag-uri"
msgid "Separate tags by commas."
msgstr "Desparte tag-urile prin virgulă."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Identificator"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
@@ -164,30 +167,59 @@ msgstr "Noua parolă"
msgid "Email me when others comment on my media"
msgstr "Trimite-mi un e-mail când alții comentează fișierele mele"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr "Titlul nu poate să fie gol"
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr "Descriere pentru această colecție"
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr "Partea din adresa acestei colecții care corespunde titlului. De regulă nu e necesar să faci o modificare."
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Există deja un entry cu același identificator pentru acest utilizator."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Editezi fișierul unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Modificările profilului au fost salvate"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Setările pentru acest cont au fost salvate"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Parolă incorectă"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr "Ai deja o colecție numită \"%s\"!"
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr "O colecție cu același slug există deja pentru acest utilizator."
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr "Lucrezi pe colecția unui alt utilizator. Se recomandă prudență."
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr "Tema nu poate fi atașată... nu există o temă selectată\n"
@@ -209,6 +241,72 @@ msgstr "Scuze, nu recunosc acest tip de fișier :("
msgid "Video transcoding failed"
msgstr "Transcodarea video a eșuat"
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr "ID client"
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr "Următorul URL"
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr "Permite"
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr "Refuză"
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr "Nume"
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr "Numele clientului OAuth"
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr "Descriere"
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr "Tip"
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr "<strong>Confidențial</strong> - Client poate\n trimite cereri către instanța GNU MediaGoblin care nu pot fi\n interceptate de către user agent (de ex., clientul de pe server).<br />\n <strong>Public</strong> - Clientul nu poate trimite cereri confidențiale\n către instanța GNU MediaGoblin (de ex., un client\n JavaScript)."
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr "URI redirectare"
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr "URI-ul de redirectare pentru aplicații, această rubrică\n este <strong>obligatorie</strong> pentru clienții publici."
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr "Această rubrică este obligatorie pentru clienții publici"
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr "Clientul {0} a fost înregistrat!"
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
@@ -217,27 +315,32 @@ msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
msgid "File"
msgstr "Fișier"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Trebuie să selectezi un fișier."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Ura! Trimis!"
-#: mediagoblin/templates/mediagoblin/404.html:22
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr "Colecția \"%s\" a fost creată!"
+
+#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Imagine cu elful 404 stresat."
-#: mediagoblin/templates/mediagoblin/404.html:23
+#: mediagoblin/templates/mediagoblin/404.html:25
msgid "Oops!"
msgstr "Hopa!"
-#: mediagoblin/templates/mediagoblin/404.html:24
+#: mediagoblin/templates/mediagoblin/404.html:26
msgid "There doesn't seem to be a page at this address. Sorry!"
msgstr "Nu există nicio pagină la această adresă. Ne pare rău!"
-#: mediagoblin/templates/mediagoblin/404.html:26
+#: mediagoblin/templates/mediagoblin/404.html:28
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
@@ -255,27 +358,32 @@ msgstr "Verifică adresa de e-mail!"
msgid "+ Add media"
msgstr "+ Adaugă fișier media"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr "+ Creează colecție"
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Vezi profilul tău"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Ieșire"
-#: mediagoblin/templates/mediagoblin/base.html:74
-#: mediagoblin/templates/mediagoblin/auth/login.html:32
-#: mediagoblin/templates/mediagoblin/auth/login.html:50
+#: mediagoblin/templates/mediagoblin/base.html:75
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Autentificare"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Construit cu <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un proiect <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -319,58 +427,62 @@ msgstr "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Creează
msgid "Most recent media"
msgstr "Cele mai recente fișiere"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:22
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
msgid "Media processing panel"
msgstr "Panou de procesare media"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:25
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
msgstr "Aici poți urmări starea fișierelor aflate în curs de procesare pe acest server."
-#: mediagoblin/templates/mediagoblin/admin/panel.html:28
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
msgid "Media in-processing"
msgstr "Fișiere în curs de procesare"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:54
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:52
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
msgid "No media in-processing"
msgstr "Niciun fișier în curs de procesare"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:55
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
msgid "These uploads failed to process:"
msgstr "Aceste fișiere nu au putut fi procesate:"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:86
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:82
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
msgid "No failed entries!"
msgstr "Niciun entry cu erori!"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:88
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
msgstr "Ultimele 10 upload-uri reușite"
-#: mediagoblin/templates/mediagoblin/admin/panel.html:108
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:103
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
msgid "No processed entries, yet!"
msgstr "Nu există încă niciun entry procesat!"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
msgstr "Stabilește noua parolă"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
msgid "Set password"
msgstr "Stabilește parola"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
msgid "Recover password"
msgstr "Recuperează parola"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
msgid "Send instructions"
msgstr "Trimite instrucțiuni"
@@ -388,27 +500,28 @@ msgid ""
"a happy goblin!"
msgstr "Bună, %(username)s\n\nPentru a schimba parola ta la GNU MediaGoblin, accesează adresa următoare:\n\n%(verification_url)s\n\nDacă ai primit acest mesaj din greșeală, ignoră-l și fii mai departe un elf fericit!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
msgid "Logging in failed!"
msgstr "Autentificare eșuată!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:40
+#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Nu ai un cont?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:41
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
msgstr "Creează-l aici!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:47
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
msgid "Forgot your password?"
msgstr "Ai uitat parola?"
-#: mediagoblin/templates/mediagoblin/auth/register.html:32
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create an account!"
msgstr "Creează un cont!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:36
+#: mediagoblin/templates/mediagoblin/auth/register.html:40
msgid "Create"
msgstr "Creează"
@@ -423,32 +536,53 @@ msgid ""
"%(verification_url)s"
msgstr "Bună, %(username)s,\n\npentru activarea contului tău la GNU MediaGoblin, accesează adresa următoare:\n\n%(verification_url)s"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr "Editare anexe la %(media_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
#, python-format
msgid "Editing %(media_title)s"
msgstr "Editare %(media_title)s"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Anulare"
-#: mediagoblin/templates/mediagoblin/edit/edit.html:37
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+#: mediagoblin/templates/mediagoblin/edit/edit.html:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Salvează modificările"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:41
#, python-format
msgid "Changing %(username)s's account settings"
msgstr "Se modifică setările contului pentru userul %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr "Editare %(collection_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editare profil %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -508,14 +642,69 @@ msgstr "Poți lua un browser modern\n<span class=\"whitespace other\" title=\"Ta
msgid "WebM file (640p; VP8/Vorbis)"
msgstr "Fișier WebM (640p; VP8/Vorbis)"
-#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Add your media"
-msgstr "Adaugă fișierele tale media"
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr "Creează o colecție"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
msgid "Add"
msgstr "Adaugă"
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr "Adaugă fișierele tale media"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr "%(collection_title)s (colecție a lui %(username)s)"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "%(collection_title)s de <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Editare"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Șterge"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr "<p>\n %(collection_description)s\n </p>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Sigur dorești să ștergi %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Șterge definitiv"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr "Sigur dorești să ștergi %(media_title)s din %(collection_title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr "Șterge"
+
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
@@ -544,14 +733,6 @@ msgstr "<p>❖ Fișierele media ale lui <a href=\"%(user_url)s\">%(username)s</a
msgid "Image for %(media_title)s"
msgstr "Imagine pentru %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Editare"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Șterge"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Adaugă un comentariu"
@@ -578,30 +759,34 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Adăugat la</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr "Anexe"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr "Atașează"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Sigur dorești să ștergi %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr "Adaugă %(title)s la colecție"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Șterge definitiv"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr "+"
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr "Creează o nouă colecție"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr "Aici poți urmări stadiul procesării fișierelor media din galeria ta."
-#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
msgstr "Ultimele tale 10 upload-uri reușite"
@@ -683,10 +868,28 @@ msgid "Add media"
msgstr "Trimite fișier"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Nu pare să existe niciun fișier media deocamdată..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr "<br />\n <a href=\"%(entry_url)s\">%(note)s</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr "<br /><a href=\"%(remove_url)s\" class=\"remove\">(șterge)</a>"
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr "În colecțiile (%(collected)s)"
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "icon feed"
@@ -738,35 +941,94 @@ msgstr "Etichete"
msgid "Could not read the image file."
msgstr "Fișierul cu imaginea nu a putut fi citit."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Sunt sigur că doresc să șterg"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr "Sunt sigur(ă) că vreau să șterg acest articol din colecție"
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr "-- Selectează --"
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr "Adaugă o notiță"
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr "a făcut un comentariu la postarea ta"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Hopa, ai uitat să scrii comentariul."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Comentariul tău a fost trimis!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr "Trebuie să alegi sau să creezi o colecție"
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr "\"%s\" este deja în colecția \"%s\""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr "\"%s\" a fost adăugat la colecția \"%s\""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr "Verifică datele și încearcă din nou."
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr "Unele fișiere din acest entry par să lipsească. Ștergem, totuși."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Ai șters acest fișier"
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Fișierul nu a fost șters deoarece nu ai confirmat că ești sigur."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Urmează să ștergi fișierele media ale unui alt utilizator. Se recomandă prudență."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr "Ai șters acest articol din colecție."
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr "Articolul nu a fost șters pentru că nu ai confirmat că ești sigur(ă)."
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr "Urmează să ștergi un articol din colecția unui alt utilizator. Se recomandă prudență."
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr "Ai șters colecția \"%s\""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr "Colecția nu a fost ștearsă pentru că nu ai confirmat că ești sigur(ă)."
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr "Urmează să ștergi colecția unui alt utilizator. Se recomandă prudență."
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
index 370b5ceb..d8967294 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
index d15f0a19..8785e8ac 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
@@ -3,13 +3,13 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# <deletesoftware@yandex.ru>, 2011, 2012.
+# <deletesoftware@yandex.ru>, 2011-2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-21 14:18+0000\n"
+"POT-Creation-Date: 2012-09-24 11:41-0500\n"
+"PO-Revision-Date: 2012-09-24 18:15+0000\n"
"Last-Translator: aleksejrs <deletesoftware@yandex.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: ru\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"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:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr "Не найдено никого с таким именем пользо
msgid "You can now log in using your new password."
msgstr "Теперь вы можете войти, используя ваш новый пароль."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Название"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr "Описание этого произведения"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "Метки"
msgid "Separate tags by commas."
msgstr "(через запятую)"
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Отличительная часть адреса"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Отличительная часть адреса необходима"
@@ -163,30 +166,58 @@ msgstr "Новый пароль"
msgid "Email me when others comment on my media"
msgstr "Уведомлять меня по e-mail о комментариях к моим файлам"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr "Описание этой коллекции"
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr "Отличительная часть адреса этой коллекции, основанная на названии. Обычно не нужно её изменять."
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "У этого пользователя уже есть файл с такой отличительной частью адреса."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Вы редактируете файлы другого пользователя. Будьте осторожны."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Вы редактируете профиль пользователя. Будьте осторожны."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Изменения профиля сохранены"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Настройки учётной записи записаны"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Неправильный пароль"
+#: mediagoblin/edit/views.py:287
+#, python-format
+msgid "You already have a collection called \"%s\"!title"
+msgstr "У вас уже есть коллекция «%s»!title"
+
+#: mediagoblin/edit/views.py:290
+msgid "A collection with that slug already exists for this user."
+msgstr "У этого пользователя уже есть коллекция с такой отличительной частью адреса."
+
+#: mediagoblin/edit/views.py:307
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr "Вы редактируете коллекцию другого пользователя. Будьте осторожны."
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr "Невозможно привязать тему… не выбрано существующей темы\n"
@@ -208,6 +239,72 @@ msgstr "Увы, я не поддерживаю этот тип файлов :("
msgid "Video transcoding failed"
msgstr "Перекодировка видео не удалась"
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Неправильный формат файла."
@@ -216,14 +313,24 @@ msgstr "Неправильный формат файла."
msgid "File"
msgstr "Файл"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Вы должны загрузить файл."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Ура! Файл загружен!"
+#: mediagoblin/submit/views.py:211 mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr "У вас уже есть коллекция с названием «%s»!"
+
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr "Коллекция «%s» добавлена!"
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Изображение 404 нервничающего гоблина"
@@ -254,28 +361,32 @@ msgstr "Подтвердите ваш адрес электронной почт
msgid "+ Add media"
msgstr "+ Добавить файл"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr "+ Добавить коллекцию"
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Посмотреть свой профиль"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Завершение сеанса"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Войти"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Работает на <a href=\"http://mediagoblin.org\">MediaGoblin</a>, проекте <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +552,17 @@ msgid "Editing %(media_title)s"
msgstr "Редактирование %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Отмена"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Сохранить изменения"
@@ -457,12 +573,19 @@ msgstr "Сохранить изменения"
msgid "Changing %(username)s's account settings"
msgstr "Настройка учётной записи %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr "Редактирование %(collection_title)s"
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Редактирование профиля %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,14 +645,68 @@ msgstr "Вы можете скачать современный браузер,\
msgid "WebM file (640p; VP8/Vorbis)"
msgstr "WebM-файл (640p; VP8/Vorbis)"
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr "Добавление коллекции"
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Добавить"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Добавление ваших файлов"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Добавить"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr "%(collection_title)s (коллекция пользователя %(username)s)"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "%(collection_title)s пользователя <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Изменить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Удалить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Удалить %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Удалить безвозвратно"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr "В самом деле исключить %(media_title)s из %(collection_title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr "Исключить"
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -559,14 +736,6 @@ msgstr "❖ Просмотр файлов пользователя <a href=\"%(u
msgid "Image for %(media_title)s"
msgstr "Изображение «%(media_title)s»"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Изменить"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Удалить"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Добавить комментарий"
@@ -593,23 +762,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Добавлено</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr "Сопутствующие файлы"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr "Добавить сопутствующий файл"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Удалить %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr "Добавить %(title)s в коллекцию"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Удалить безвозвратно"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr "Добавление новой коллекции"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -698,10 +871,28 @@ msgid "Add media"
msgstr "Добавить файлы"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Пока что тут файлов нет…"
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr "В %(collected)s коллекциях"
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "значок ленты"
@@ -753,35 +944,94 @@ msgstr "Метки"
msgid "Could not read the image file."
msgstr "Не удалось прочитать файл с изображением."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Я уверен, что хочу удалить это"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr "Я уверен, что хочу исключить этот файл из коллекции"
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr "-- Выберите --"
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr "Примечание"
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr "оставил комментарий к вашему файлу"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Ой, ваш комментарий был пуст."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Ваш комментарий размещён!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr "Необходимо выбрать или добавить коллекцию"
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr "«%s» — уже в коллекции «%s»"
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr "«%s» добавлено в коллекцию «%s»"
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr "Некоторые файлы от этой записи не обнаружены. Всё равно удаляем."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Вы удалили файл."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Файл не удалён, так как вы не подтвердили свою уверенность галочкой."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Вы на пороге удаления файла другого пользователя. Будьте осторожны."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr "Вы исключили файл из коллекции."
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr "Файл не исключён из коллекции, так как вы не подтвердили своё намерение отметкой."
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr "Вы на пороге исключения файла из коллекции другого пользователя. Будьте осторожны."
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr "Вы удалили коллекцию «%s»"
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr "Коллекция не удалена, так как вы не подтвердили своё намерение отметкой."
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr "Вы на пороге удаления коллекции другого пользователя. Будьте осторожны."
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
index 60ab748c..48a3873f 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
index 19d9a3e4..4d59ccd5 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
@@ -4,13 +4,13 @@
#
# Translators:
# Martin Zatroch <zatroch.martin@gmail.com>, 2012.
-# <zatroch.martin@gmail.com>, 2011, 2012.
+# <zatroch.martin@gmail.com>, 2011-2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: sk\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr "Nebolo možné nájsť nikoho s týmto používateľským menom alebo e-
msgid "You can now log in using your new password."
msgstr "Teraz sa môžeš prihlásiť so svojim novým heslom."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Nadpis"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "Charakteristika tohto diela"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Značky"
msgid "Separate tags by commas."
msgstr "Oddeľ jednotlivé štítky čiarkami."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Unikátna časť adresy"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Unikátna časť adresy nesmie byť prázdna"
@@ -162,43 +165,72 @@ msgstr "Nové heslo"
#: mediagoblin/edit/forms.py:72
msgid "Email me when others comment on my media"
+msgstr "Zaslať mi e-mail, keď ostatní pridajú komentár k médiu"
+
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Položku s rovnakou unikátnou časťou adresy už niekde máš."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Upravuješ médiá niekoho iného. Dbaj na to."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Upravuješ používateľský profil. Dbaj na to."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Úpravy profilu uložené"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Nastavenia účtu uložené"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Nesprávne heslo"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
-msgstr ""
+msgstr "Nemôžem priradiť tému.. žiadny set témy\n"
#: mediagoblin/gmg_commands/theme.py:71
msgid "No asset directory for this theme\n"
-msgstr ""
+msgstr "Žiadny priečinok položiek pre túto tému\n"
#: mediagoblin/gmg_commands/theme.py:74
msgid "However, old link directory symlink found; removed.\n"
-msgstr ""
+msgstr "Hoci, starý symbolický odkaz na priečinok nájdený; odstránený.\n"
#: mediagoblin/media_types/__init__.py:60
#: mediagoblin/media_types/__init__.py:120
@@ -207,6 +239,72 @@ msgstr "Prepáč, nepodporujem tento súborový typ =("
#: mediagoblin/media_types/video/processing.py:35
msgid "Video transcoding failed"
+msgstr "Konvertovanie videa zlyhalo"
+
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
msgstr ""
#: mediagoblin/processing/__init__.py:138
@@ -217,14 +315,19 @@ msgstr "Odovzdaný nesprávny súbor pre daný typ média."
msgid "File"
msgstr "Súbor"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Musíš poskytnúť súbor."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Juchú! Úspešne vložené!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Obrázok stresujúceho goblina pri chybovom kóde č. 404"
@@ -255,28 +358,32 @@ msgstr "Over si e-mailovú adresu!"
msgid "+ Add media"
msgstr "+ Pridať výtvor"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Zobraziť svoj profil"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Odhlásiť sa"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Prihlásenie"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Poháňa nás <a href=\"http://mediagoblin.org\">MediaGoblin</a>, súčasť projektu <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -302,7 +409,7 @@ msgstr "Táto stránka používa <a href=\"http://mediagoblin.org\">MediaGoblin<
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
-msgstr ""
+msgstr "Pre umiestnenie vlastných médií, pridanie komentárov a viac, sa môžeš prihlásiť so svojim MediaGoblin účtom."
#: mediagoblin/templates/mediagoblin/root.html:31
msgid "Don't have one yet? It's easy!"
@@ -330,7 +437,7 @@ msgstr "Sekcia spracovania výtvorov"
#: mediagoblin/templates/mediagoblin/admin/panel.html:29
msgid ""
"Here you can track the state of media being processed on this instance."
-msgstr ""
+msgstr "Tu môžeš sledovať stav médií spracovávaných na tejto inštancii."
#: mediagoblin/templates/mediagoblin/admin/panel.html:32
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
@@ -350,16 +457,16 @@ msgstr "Nasledovné nahratia neprešli spracovaním:"
#: mediagoblin/templates/mediagoblin/admin/panel.html:90
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
msgid "No failed entries!"
-msgstr ""
+msgstr "Žiadne zlé položky!"
#: mediagoblin/templates/mediagoblin/admin/panel.html:92
msgid "Last 10 successful uploads"
-msgstr ""
+msgstr "Posledných 10 úspešných nahratí"
#: mediagoblin/templates/mediagoblin/admin/panel.html:112
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
msgid "No processed entries, yet!"
-msgstr ""
+msgstr "Zatiaľ žiadne spracované položky!"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
@@ -433,7 +540,7 @@ msgstr "Ahoj %(username)s,\n\npre aktiváciu tvojho GNU MediaGoblin účtu, otvo
#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
#, python-format
msgid "Editing attachments for %(media_title)s"
-msgstr ""
+msgstr "Úprava príloh pre %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:23
#: mediagoblin/templates/mediagoblin/edit/edit.html:35
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "Úprava %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Zrušiť"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Uložiť zmeny"
@@ -458,12 +570,19 @@ msgstr "Uložiť zmeny"
msgid "Changing %(username)s's account settings"
msgstr "Mením nastavenia účtu používateľa %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Úprava profilu, ktorý vlastní %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -499,7 +618,7 @@ msgstr "Môžeš získať moderný prehliadač, ktorý\n\ttento zvuk hravo prehr
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
#: mediagoblin/templates/mediagoblin/media_displays/video.html:56
msgid "Original file"
-msgstr ""
+msgstr "Originálny súbor"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
msgid "WebM file (Vorbis codec)"
@@ -521,23 +640,77 @@ msgstr "Môžeš získať moderný prehliadač, ktorý \n<span class=\"whitespac
#: mediagoblin/templates/mediagoblin/media_displays/video.html:59
msgid "WebM file (640p; VP8/Vorbis)"
+msgstr "WebM súbor (640p; VP8/Vorbis)"
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Pridať"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Pridaj svoj výtvor"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Pridať"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Upraviť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Odstrániť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Skutočne odstrániť %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Odstráň permanentne"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
msgid ""
"Hi %(username)s,\n"
"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
-msgstr ""
+msgstr "Ahoj %(username)s,\npoužívateľ %(comment_author)s skomentoval tvoj príspevok (%(comment_url)s) na %(instance_name)s\n"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
#, python-format
@@ -560,14 +733,6 @@ msgstr "❖ Prezeranie výtvorov podľa <a href=\"%(user_url)s\">%(username)s</a
msgid "Image for %(media_title)s"
msgstr "Obrázok pre %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Upraviť"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Odstrániť"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Pridaj komentár"
@@ -594,23 +759,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Pridané</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
-msgstr ""
+msgstr "Prílohy"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
-msgstr ""
+msgstr "Pridať prílohu"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Skutočne odstrániť %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Odstráň permanentne"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -619,7 +788,7 @@ msgstr "Tu môžeš sledovať priebeh spracovania výtvorov pre svoju galériu."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
msgid "Your last 10 successful uploads"
-msgstr ""
+msgstr "Tvojich 10 posledných úspešných nahratí"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "Pridať výtvor"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Najskôr sa tu ešte nenachádzajú žiadne výtvory..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "ikona čítačky"
@@ -754,35 +941,94 @@ msgstr "Označené ako"
msgid "Could not read the image file."
msgstr "Nebolo možné prečítať obrazový súbor."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Jednoznačne to chcem odstrániť"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
-msgstr ""
+msgstr "skomentoval tvoj príspevok"
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Ajaj, tvoj komentár bol prázdny."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Tvoj komentár bol zaslaný!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
-msgstr ""
+msgstr "Niektoré súbory s danou položkou zrejme chýbajú.. Odstraňujem napriek tomu."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Výtvor bol tebou odstránený."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Výtvor nebol odstránený, nakoľko chýbalo tvoje potvrdenie."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Chystáš sa odstrániť výtvory niekoho iného. Dbaj na to."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
index db167b59..38a19ef6 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
+++ 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
index 806635bc..d05f1ebc 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"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"
+"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:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Naslov"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "Oznake"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Oznaka"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
@@ -163,30 +166,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Vnos s to oznako za tega uporabnika že obstaja."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Urejate uporabniški profil. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Za vrsto vsebine je bila podana napačna datoteka."
@@ -216,14 +314,19 @@ msgstr "Za vrsto vsebine je bila podana napačna datoteka."
msgid "File"
msgstr "Datoteka"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Podati morate datoteko."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Juhej! Poslano."
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Slika napake 404 s paničnim škratom"
@@ -254,28 +357,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Prijava"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "Urejanje %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Prekliči"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Shrani spremembe"
@@ -457,12 +569,19 @@ msgstr "Shrani spremembe"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Urejanje profila – %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +641,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -559,14 +732,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -593,22 +758,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr "Dodaj vsebino"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Videti je, da tu še ni nobene vsebine ..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "Ikona vira"
@@ -753,35 +940,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
index 496f337a..be3b75db 100644
--- a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
index aa3c2cc1..5147dcc3 100644
--- a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Albanian (http://www.transifex.com/projects/p/mediagoblin/language/sq/)\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: sq\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr "Nuk u gjet dot dikush me atë emër përdoruesi ose email."
msgid "You can now log in using your new password."
msgstr "Tani mun të hyni duke përdorur fjalëkalimin tuaj të ri."
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titull"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr "Përshkrim i kësaj pune"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr "Etiketa"
msgid "Separate tags by commas."
msgstr "Ndajini etiketat me presje."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Identifikues"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Identifikuesi s'mund të jetë i zbrazët"
@@ -163,30 +166,59 @@ msgstr "Fjalëkalimi i ri"
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ka tashmë një zë me atë identifikues për këtë përdorues."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Po përpunoni media të një tjetër përdoruesi. Bëni kujdes."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Po përpunoni profilin e një përdoruesi. Bëni kujdes."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "Ndryshimet e profilit u ruajtën"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "Rregullimet e llogarisë u ruajtën"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Fjalëkalim i gabuar"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr "Na ndjeni, nuk e mbullojmë këtë lloj kartele :("
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Kartelë e gabuar e dhënë për llojin e medias."
@@ -216,14 +314,19 @@ msgstr "Kartelë e gabuar e dhënë për llojin e medias."
msgid "File"
msgstr "Kartelë"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Duhet të jepni një kartelë."
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Yhaaaaaa! U parashtrua!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Figurë 404 e djallushit në siklet"
@@ -254,28 +357,32 @@ msgstr "Verifikoni email-in tuaj!"
msgid "+ Add media"
msgstr "+ Shtoni media"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "Shihni profilin tuaj"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "Dilni"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Hyni"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "Bazuar në <a href=\"http://mediagoblin.org\">MediaGoblin</a>, një projekt <a href=\"http://gnu.org/\">GNU</a>."
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr "Po përpunohet %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Anuloje"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Ruaji ndryshimet"
@@ -457,12 +569,19 @@ msgstr "Ruaji ndryshimet"
msgid "Changing %(username)s's account settings"
msgstr "Po ndryshohen rregullimet e llogarisë %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Po përpunohet profili i %(username)s"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,14 +641,68 @@ msgstr "Një shfletues web modern që \n\t mund ta luajë këtë video mund t
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "Shtoni"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "Shtoni media tuajën"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "Shtoni"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "Përpunoni"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "Fshije"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Të fshihet vërtet %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "Fshije përgjithmonë"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -559,14 +732,6 @@ msgstr "❖ Po shfletoni media nga <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Image for %(media_title)s"
msgstr "Figurë për %(media_title)s"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "Përpunoni"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "Fshije"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "Shtoni një koment"
@@ -593,23 +758,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>Shtuar më</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Të fshihet vërtet %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "Fshije përgjithmonë"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr "Shtoni media"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Nuk duket ende të ketë ndonjë media këtu..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "ikonë prurjesh"
@@ -753,35 +940,94 @@ msgstr "Etiketuar me"
msgid "Could not read the image file."
msgstr "Nuk lexoi dot kartelën e figurës."
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Jam i sigurt që dua të fshihet kjo"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "Hmmm, komenti juaj qe i zbrazët."
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "Komenti juaj u postua!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "E fshitë median."
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Media nuk u fshi ngaqë nuk i vutë shenjë pohimit se jeni i sigurt."
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ju ndan një hap nga fshirja e medias të një tjetër përdoruesi. Bëni kujdes."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
index f8d731fc..132ae65d 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
+++ 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
index 77d12950..168337b2 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Serbian (http://www.transifex.com/projects/p/mediagoblin/language/sr/)\n"
"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
"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"
+"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:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -91,7 +91,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr ""
@@ -100,7 +102,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -115,11 +118,11 @@ msgstr ""
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -162,30 +165,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -207,6 +239,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -215,14 +313,19 @@ msgstr ""
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -253,28 +356,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -440,12 +547,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr ""
@@ -456,12 +568,19 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -521,13 +640,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -558,14 +731,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -592,22 +757,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -697,10 +866,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -752,35 +939,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
index 41a237ed..e2a0bc66 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
+++ 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
index 65d288b7..fda30875 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/mediagoblin/language/sv/)\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: sv\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "Titel"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "Beskrivning av verket"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "Taggar"
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "Sökvägsnamn"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
@@ -164,30 +167,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ett inlägg med det sökvägsnamnet existerar redan."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Var försiktig, du redigerar någon annans inlägg."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Var försiktig, du redigerar en annan användares profil."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "Fel lösenord"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "Ogiltig fil för mediatypen."
@@ -217,14 +315,19 @@ msgstr "Ogiltig fil för mediatypen."
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "Du måste ange en fil"
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "Tjohoo! Upladdat!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Bild av stressat 404-troll."
@@ -255,28 +358,32 @@ msgstr "Verifiera din e-postadress"
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "Logga in"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "Redigerar %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "Spara ändringar"
@@ -458,12 +570,19 @@ msgstr "Spara ändringar"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redigerar %(username)ss profil"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,13 +642,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Vill du verkligen radera %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -560,14 +733,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -594,22 +759,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "Vill du verkligen radera %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "Lägg till media"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Det verkar inte finnas någon media här ännu."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "feed-ikon"
@@ -754,35 +941,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "Jag är säker på att jag vill radera detta"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du tänker radera en annan användares media. Var försiktig."
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
index 712ee9b7..e341a891 100644
--- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
index 540c8bde..17d5910c 100644
--- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: te\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -92,7 +92,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "శీర్షిక"
@@ -101,7 +103,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -116,11 +119,11 @@ msgstr ""
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -163,30 +166,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -208,6 +240,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -216,14 +314,19 @@ msgstr ""
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -254,28 +357,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -441,12 +548,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "రద్దుచేయి"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "మార్పులను భద్రపరచు"
@@ -457,12 +569,19 @@ msgstr "మార్పులను భద్రపరచు"
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -522,13 +641,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -559,14 +732,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -593,22 +758,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -698,10 +867,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -753,35 +940,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
index 5b34f79c..99f0c85b 100644
--- a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
index 4d30d0b4..0729a2e7 100644
--- a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Chinese (Taiwan) (Big5) (http://www.transifex.com/projects/p/mediagoblin/language/zh_TW.Big5/)\n"
"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: zh_TW.Big5\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -91,7 +91,9 @@ msgstr ""
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr ""
@@ -100,7 +102,8 @@ msgid "Description of this work"
msgstr ""
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -115,11 +118,11 @@ msgstr ""
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr ""
@@ -162,30 +165,59 @@ msgstr ""
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr ""
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -207,6 +239,72 @@ msgstr ""
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr ""
@@ -215,14 +313,19 @@ msgstr ""
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr ""
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr ""
@@ -253,28 +356,32 @@ msgstr ""
msgid "+ Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
-msgid "View your profile"
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/base.html:69
+msgid "View your profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -440,12 +547,17 @@ msgid "Editing %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr ""
@@ -456,12 +568,19 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -521,13 +640,67 @@ msgstr ""
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
@@ -558,14 +731,6 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr ""
@@ -592,22 +757,26 @@ msgid ""
" <p>%(date)s</p>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
+msgid "Add %(title)s to collection"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
@@ -697,10 +866,28 @@ msgid "Add media"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr ""
@@ -752,35 +939,94 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
index 66edc72e..379f1bdc 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
index d72bb6c2..b8673f51 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2012-08-19 14:21-0500\n"
-"PO-Revision-Date: 2012-08-19 19:21+0000\n"
+"POT-Creation-Date: 2012-09-24 14:01-0500\n"
+"PO-Revision-Date: 2012-09-24 18:57+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: zh_TW\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
@@ -93,7 +93,9 @@ msgstr "找不到相關的使用者名稱或是電子郵件。"
msgid "You can now log in using your new password."
msgstr "你現在可以用新的密碼登入了!"
-#: mediagoblin/edit/forms.py:25 mediagoblin/submit/forms.py:28
+#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:83
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:40
msgid "Title"
msgstr "標題"
@@ -102,7 +104,8 @@ msgid "Description of this work"
msgstr "這個作品的描述"
#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:87 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:44
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
@@ -117,11 +120,11 @@ msgstr "標籤"
msgid "Separate tags by commas."
msgstr "用逗號分隔標籤。"
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:91
msgid "Slug"
msgstr "自訂字串"
-#: mediagoblin/edit/forms.py:39
+#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:92
msgid "The slug can't be empty"
msgstr "自訂字串不能空白"
@@ -164,30 +167,59 @@ msgstr "新密碼"
msgid "Email me when others comment on my media"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:84
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:43
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:93
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "這個自訂字串已經被其他人用了"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "你正在編輯他人的媒體檔案. 請謹慎處理."
-#: mediagoblin/edit/views.py:181
+#: mediagoblin/edit/views.py:182
msgid "You are editing a user's profile. Proceed with caution."
msgstr "你正在編輯一位用戶的檔案. 請謹慎處理."
-#: mediagoblin/edit/views.py:197
+#: mediagoblin/edit/views.py:198
msgid "Profile changes saved"
msgstr "修改的檔案已存檔"
-#: mediagoblin/edit/views.py:226 mediagoblin/edit/views.py:246
+#: mediagoblin/edit/views.py:227 mediagoblin/edit/views.py:247
msgid "Account settings saved"
msgstr "帳號設定已存檔"
-#: mediagoblin/edit/views.py:251
+#: mediagoblin/edit/views.py:252
msgid "Wrong password"
msgstr "密碼錯誤"
+#: mediagoblin/edit/views.py:288 mediagoblin/submit/views.py:211
+#: mediagoblin/user_pages/views.py:215
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:292
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:309
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
#: mediagoblin/gmg_commands/theme.py:58
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -209,6 +241,72 @@ msgstr "抱歉,我不支援這樣的檔案格式 :("
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/plugins/oauth/forms.py:26
+msgid "Client ID"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:28
+msgid "Next URL"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:31
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:37
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:39
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:41
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:46
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:53
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:55
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:67
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:59
+msgid "The client {0} has been registered!"
+msgstr ""
+
#: mediagoblin/processing/__init__.py:138
msgid "Invalid file given for media type."
msgstr "指定錯誤的媒體類別!"
@@ -217,14 +315,19 @@ msgstr "指定錯誤的媒體類別!"
msgid "File"
msgstr "檔案"
-#: mediagoblin/submit/views.py:56
+#: mediagoblin/submit/views.py:57
msgid "You must provide a file."
msgstr "你必須提供一個檔案"
-#: mediagoblin/submit/views.py:163
+#: mediagoblin/submit/views.py:164
msgid "Woohoo! Submitted!"
msgstr "呼呼! 送出去嚕!"
+#: mediagoblin/submit/views.py:215
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "Image of 404 goblin stressing out"
msgstr "Image of 404 goblin stressing out"
@@ -255,28 +358,32 @@ msgstr "確認你的電子郵件"
msgid "+ Add media"
msgstr "+ 加入媒體"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:67
+msgid "+ Add collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:69
msgid "View your profile"
msgstr "檢視你個人檔案"
-#: mediagoblin/templates/mediagoblin/base.html:69
+#: mediagoblin/templates/mediagoblin/base.html:70
msgid "Log out"
msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:28
#: mediagoblin/templates/mediagoblin/auth/login.html:36
#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Log in"
msgstr "登入"
-#: mediagoblin/templates/mediagoblin/base.html:88
+#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project."
msgstr "由 <a href=\"http://mediagoblin.org\">MediaGoblin</a>製作, 它是一個 <a href=\"http://gnu.org/\">GNU</a> 專案"
-#: mediagoblin/templates/mediagoblin/base.html:91
+#: mediagoblin/templates/mediagoblin/base.html:92
#, python-format
msgid ""
"Released under the <a "
@@ -442,12 +549,17 @@ msgid "Editing %(media_title)s"
msgstr "編輯 %(media_title)s 中"
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:82
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "取消"
#: mediagoblin/templates/mediagoblin/edit/edit.html:43
#: mediagoblin/templates/mediagoblin/edit/edit_account.html:47
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:41
msgid "Save changes"
msgstr "儲存變更"
@@ -458,12 +570,19 @@ msgstr "儲存變更"
msgid "Changing %(username)s's account settings"
msgstr "正在改變 %(username)s的帳號設定"
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#, python-format
msgid "Editing %(username)s's profile"
msgstr "編輯 %(username)s'的檔案中"
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
#: mediagoblin/templates/mediagoblin/listings/tag.html:35
#, python-format
@@ -523,14 +642,68 @@ msgstr "你可以取得\n<span class=\"whitespace other\" title=\"Tab\">»</span
msgid "WebM file (640p; VP8/Vorbis)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:83
+msgid "Add"
+msgstr "增加"
+
#: mediagoblin/templates/mediagoblin/submit/start.html:23
#: mediagoblin/templates/mediagoblin/submit/start.html:30
msgid "Add your media"
msgstr "加入你的媒體"
-#: mediagoblin/templates/mediagoblin/submit/start.html:34
-msgid "Add"
-msgstr "增加"
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
+msgid "Edit"
+msgstr "編輯"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Delete"
+msgstr "刪除"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:59
+#, python-format
+msgid ""
+"<p>\n"
+" %(collection_description)s\n"
+" </p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "真的要刪除 %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete permanently"
+msgstr "永遠刪除"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -560,14 +733,6 @@ msgstr "❖ 由 <a href=\"%(user_url)s\">%(username)s</a>瀏覽媒體檔案"
msgid "Image for %(media_title)s"
msgstr " %(media_title)s的照片"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:87
-msgid "Edit"
-msgstr "編輯"
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
-msgid "Delete"
-msgstr "刪除"
-
#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
msgid "Add a comment"
msgstr "新增評論"
@@ -594,23 +759,27 @@ msgid ""
" <p>%(date)s</p>"
msgstr "<h3>加入日期</h3>\n <p>%(date)s</p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:167
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:183
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
msgid "Attachments"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:188
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:192
msgid "Add attachment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:35
#, python-format
-msgid "Really delete %(title)s?"
-msgstr "真的要刪除 %(title)s?"
+msgid "Add %(title)s to collection"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
-msgid "Delete permanently"
-msgstr "永遠刪除"
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:52
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:57
+msgid "Add a new collection"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
msgid ""
@@ -699,10 +868,28 @@ msgid "Add media"
msgstr "新增媒體檔案"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:87
#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "似乎還沒有任何的媒體檔案..."
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:39
+#, python-format
+msgid ""
+"<br />\n"
+" <a href=\"%(entry_url)s\">%(note)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:47
+#, python-format
+msgid "<br /><a href=\"%(remove_url)s\" class=\"remove\">(remove)</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:20
+#, python-format
+msgid "In collections (%(collected)s)"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
msgstr "feed圖示"
@@ -754,35 +941,94 @@ msgstr "標籤為"
msgid "Could not read the image file."
msgstr "無法讀取影像檔案。"
-#: mediagoblin/user_pages/forms.py:30
+#: mediagoblin/user_pages/forms.py:28
msgid "I am sure I want to delete this"
msgstr "我確定我想要刪除"
+#: mediagoblin/user_pages/forms.py:32
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:37
+msgid "Include a note"
+msgstr ""
+
#: mediagoblin/user_pages/lib.py:56
msgid "commented on your post"
msgstr ""
-#: mediagoblin/user_pages/views.py:160
+#: mediagoblin/user_pages/views.py:161
msgid "Oops, your comment was empty."
msgstr "啊,你的留言是空的。"
-#: mediagoblin/user_pages/views.py:166
+#: mediagoblin/user_pages/views.py:167
msgid "Your comment has been posted!"
msgstr "你的留言已經刊登!"
-#: mediagoblin/user_pages/views.py:200
+#: mediagoblin/user_pages/views.py:235
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:243
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:258
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:266
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:297
msgid ""
"Some of the files with this entry seem to be missing. Deleting anyway."
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "你已刪除此媒體檔案。"
-#: mediagoblin/user_pages/views.py:212
+#: mediagoblin/user_pages/views.py:309
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "此媒體檔案尚未被刪除因為你還沒有確認你真的要刪除。"
-#: mediagoblin/user_pages/views.py:220
+#: mediagoblin/user_pages/views.py:317
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "你在刪除其他人的媒體檔案。請小心處理喔。"
+
+#: mediagoblin/user_pages/views.py:379
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:383
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:393
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:426
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:433
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:443
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/init/celery/from_celery.py b/mediagoblin/init/celery/from_celery.py
index b8297255..41fffa45 100644
--- a/mediagoblin/init/celery/from_celery.py
+++ b/mediagoblin/init/celery/from_celery.py
@@ -15,6 +15,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
+import logging
+
+from configobj import ConfigObj
+from ConfigParser import RawConfigParser
+from celery.signals import setup_logging
from mediagoblin import app, mg_globals
from mediagoblin.init.celery import setup_celery_from_config
@@ -22,6 +27,62 @@ from mediagoblin.init.celery import setup_celery_from_config
OUR_MODULENAME = __name__
+_log = logging.getLogger(__name__)
+
+
+def setup_logging_from_paste_ini(loglevel, **kw):
+ if os.path.exists(os.path.abspath('paste_local.ini')):
+ logging_conf_file = 'paste_local.ini'
+ else:
+ logging_conf_file = 'paste.ini'
+
+ if not os.path.exists(logging_conf_file):
+ raise IOError('{0} does not exist. Logging can not be set up.'.format(
+ logging_conf_file))
+
+ logging_conf = ConfigObj(logging_conf_file)
+
+ config = logging_conf
+
+ # Read raw config to avoid interpolation of formatting parameters
+ raw_config = RawConfigParser()
+ raw_config.readfp(open(logging_conf_file))
+
+ # Set up formatting
+ # Get the format string and circumvent configobj interpolation of the value
+ fmt = raw_config.get('formatter_generic', 'format')
+
+ # Create the formatter
+ formatter = logging.Formatter(fmt)
+
+ # Check for config values
+ if not config.get('loggers') or not config['loggers'].get('keys'):
+ print('No loggers found')
+ return
+
+ # Iterate all teh loggers.keys values
+ for name in config['loggers']['keys'].split(','):
+ if not config.get('logger_{0}'.format(name)):
+ continue
+
+ log_params = config['logger_{0}'.format(name)]
+
+ qualname = log_params['qualname'] if 'qualname' in log_params else name
+
+ if qualname == 'root':
+ qualname = None
+
+ logger = logging.getLogger(qualname)
+
+ level = getattr(logging, log_params['level'])
+ logger.setLevel(level)
+
+ for handler in logger.handlers:
+ handler.setFormatter(formatter)
+
+
+setup_logging.connect(setup_logging_from_paste_ini)
+
def setup_self(check_environ_for_conf=True, module_name=OUR_MODULENAME,
default_conf_file=None):
diff --git a/mediagoblin/listings/routing.py b/mediagoblin/listings/routing.py
index d228a727..d25f1c8c 100644
--- a/mediagoblin/listings/routing.py
+++ b/mediagoblin/listings/routing.py
@@ -14,14 +14,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+from mediagoblin.routing import add_route
-from routes.route import Route
-
-tag_routes = [
- # Route('mediagoblin.listings.tags_home', "/",
- # controller="mediagoblin.listings.views:tags_home"),
- Route('mediagoblin.listings.tags_listing', "/{tag}/",
- controller="mediagoblin.listings.views:tag_listing"),
- Route('mediagoblin.listings.tag_atom_feed', "/{tag}/atom/",
- controller="mediagoblin.listings.views:tag_atom_feed"),
- ]
+add_route('mediagoblin.listings.tags_listing',
+ "/tag/<string:tag>/",
+ "mediagoblin.listings.views:tag_listing")
+add_route('mediagoblin.listings.tag_atom_feed', "/tag/<string:tag>/atom/",
+ "mediagoblin.listings.views:tag_atom_feed")
diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py
index 74502dc4..1488e6d9 100644
--- a/mediagoblin/meddleware/csrf.py
+++ b/mediagoblin/meddleware/csrf.py
@@ -132,7 +132,7 @@ class CsrfMeddleware(BaseMeddleware):
return HTTPForbidden()
# get the form token and confirm it matches
- form = CsrfForm(request.POST)
+ form = CsrfForm(request.form)
if form.validate():
form_token = form.csrf_token.data
diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py
index 93d2319f..5bf0124c 100644
--- a/mediagoblin/media_types/__init__.py
+++ b/mediagoblin/media_types/__init__.py
@@ -44,8 +44,8 @@ def sniff_media(media):
# Create a temporary file for sniffers suchs as GStreamer-based
# Audio video
media_file = tempfile.NamedTemporaryFile()
- media_file.write(media.file.read())
- media.file.seek(0)
+ media_file.write(media.stream.read())
+ media.stream.seek(0)
for media_type, manager in get_media_managers():
_log.info('Sniffing {0}'.format(media_type))
diff --git a/mediagoblin/media_types/audio/spectrogram.py b/mediagoblin/media_types/audio/spectrogram.py
new file mode 100644
index 00000000..458855c1
--- /dev/null
+++ b/mediagoblin/media_types/audio/spectrogram.py
@@ -0,0 +1,357 @@
+# processing.py -- various audio processing functions
+# Copyright (C) 2008 MUSIC TECHNOLOGY GROUP (MTG)
+# UNIVERSITAT POMPEU FABRA
+#
+# 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/>.
+#
+# Authors:
+# Bram de Jong <bram.dejong at domain.com where domain in gmail>
+# 2012, Joar Wandborg <first name at last name dot se>
+
+from PIL import Image
+import math
+import numpy
+
+try:
+ import scikits.audiolab as audiolab
+except ImportError:
+ print "WARNING: audiolab is not installed so wav2png will not work"
+
+
+class AudioProcessingException(Exception):
+ pass
+
+
+class SpectrogramImage(object):
+ def __init__(self, image_size, fft_size):
+ self.image_width, self.image_height = image_size
+ self.fft_size = fft_size
+
+ colors = [
+ (0, 0, 0, 0),
+ (58 / 4, 68 / 4, 65 / 4, 255),
+ (80 / 2, 100 / 2, 153 / 2, 255),
+ (90, 180, 100, 255),
+ (224, 224, 44, 255),
+ (255, 60, 30, 255),
+ (255, 255, 255, 255)
+ ]
+
+ self.palette = interpolate_colors(colors)
+
+ # Generate lookup table for y-coordinate from fft-bin
+ self.y_to_bin = []
+
+ fft_min = 100.0
+ fft_max = 22050.0 # kHz?
+
+ y_min = math.log10(fft_min)
+ y_max = math.log10(fft_max)
+
+ for y in range(self.image_height):
+ freq = math.pow(
+ 10.0,
+ y_min + y / (self.image_height - 1.0)
+ * (y_max - y_min))
+
+ fft_bin = freq / fft_max * (self.fft_size / 2 + 1)
+
+ if fft_bin < self.fft_size / 2:
+ alpha = fft_bin - int(fft_bin)
+
+ self.y_to_bin.append((int(fft_bin), alpha * 255))
+
+ # this is a bit strange, but using image.load()[x,y] = ... is
+ # a lot slower than using image.putadata and then rotating the image
+ # so we store all the pixels in an array and then create the image when saving
+ self.pixels = []
+
+ def draw_spectrum(self, x, spectrum):
+ # for all frequencies, draw the pixels
+ for index, alpha in self.y_to_bin:
+ self.pixels.append(
+ self.palette[int((255.0 - alpha) * spectrum[index]
+ + alpha * spectrum[index + 1])])
+
+ # if the FFT is too small to fill up the image, fill with black to the top
+ for y in range(len(self.y_to_bin), self.image_height):
+ self.pixels.append(self.palette[0])
+
+ def save(self, filename, quality=90):
+ self.image = Image.new(
+ 'RGBA',
+ (self.image_height, self.image_width))
+
+ self.image.putdata(self.pixels)
+ self.image.transpose(Image.ROTATE_90).save(
+ filename,
+ quality=quality)
+
+
+class AudioProcessor(object):
+ """
+ The audio processor processes chunks of audio an calculates the spectrac centroid and the peak
+ samples in that chunk of audio.
+ """
+ def __init__(self, input_filename, fft_size, window_function=numpy.hanning):
+ max_level = get_max_level(input_filename)
+
+ self.audio_file = audiolab.Sndfile(input_filename, 'r')
+ self.fft_size = fft_size
+ self.window = window_function(self.fft_size)
+ self.spectrum_range = None
+ self.lower = 100
+ self.higher = 22050
+ self.lower_log = math.log10(self.lower)
+ self.higher_log = math.log10(self.higher)
+ self.clip = lambda val, low, high: min(high, max(low, val))
+
+ # figure out what the maximum value is for an FFT doing the FFT of a DC signal
+ fft = numpy.fft.rfft(numpy.ones(fft_size) * self.window)
+ max_fft = (numpy.abs(fft)).max()
+
+ # set the scale to normalized audio and normalized FFT
+ self.scale = 1.0 / max_level / max_fft if max_level > 0 else 1
+
+ def read(self, start, size, resize_if_less=False):
+ """ read size samples starting at start, if resize_if_less is True and less than size
+ samples are read, resize the array to size and fill with zeros """
+
+ # number of zeros to add to start and end of the buffer
+ add_to_start = 0
+ add_to_end = 0
+
+ if start < 0:
+ # the first FFT window starts centered around zero
+ if size + start <= 0:
+ return numpy.zeros(size) if resize_if_less else numpy.array([])
+ else:
+ self.audio_file.seek(0)
+
+ add_to_start = - start # remember: start is negative!
+ to_read = size + start
+
+ if to_read > self.audio_file.nframes:
+ add_to_end = to_read - self.audio_file.nframes
+ to_read = self.audio_file.nframes
+ else:
+ self.audio_file.seek(start)
+
+ to_read = size
+ if start + to_read >= self.audio_file.nframes:
+ to_read = self.audio_file.nframes - start
+ add_to_end = size - to_read
+
+ try:
+ samples = self.audio_file.read_frames(to_read)
+ except RuntimeError:
+ # this can happen for wave files with broken headers...
+ return numpy.zeros(size) if resize_if_less else numpy.zeros(2)
+
+ # convert to mono by selecting left channel only
+ if self.audio_file.channels > 1:
+ samples = samples[:,0]
+
+ if resize_if_less and (add_to_start > 0 or add_to_end > 0):
+ if add_to_start > 0:
+ samples = numpy.concatenate((numpy.zeros(add_to_start), samples), axis=1)
+
+ if add_to_end > 0:
+ samples = numpy.resize(samples, size)
+ samples[size - add_to_end:] = 0
+
+ return samples
+
+ def spectral_centroid(self, seek_point, spec_range=110.0):
+ """ starting at seek_point read fft_size samples, and calculate the spectral centroid """
+
+ samples = self.read(seek_point - self.fft_size/2, self.fft_size, True)
+
+ samples *= self.window
+ fft = numpy.fft.rfft(samples)
+ spectrum = self.scale * numpy.abs(fft) # normalized abs(FFT) between 0 and 1
+
+ length = numpy.float64(spectrum.shape[0])
+
+ # scale the db spectrum from [- spec_range db ... 0 db] > [0..1]
+ db_spectrum = ((20*(numpy.log10(spectrum + 1e-60))).clip(-spec_range, 0.0) + spec_range)/spec_range
+
+ energy = spectrum.sum()
+ spectral_centroid = 0
+
+ if energy > 1e-60:
+ # calculate the spectral centroid
+
+ if self.spectrum_range == None:
+ self.spectrum_range = numpy.arange(length)
+
+ spectral_centroid = (spectrum * self.spectrum_range).sum() / (energy * (length - 1)) * self.audio_file.samplerate * 0.5
+
+ # clip > log10 > scale between 0 and 1
+ spectral_centroid = (math.log10(self.clip(spectral_centroid, self.lower, self.higher)) - self.lower_log) / (self.higher_log - self.lower_log)
+
+ return (spectral_centroid, db_spectrum)
+
+
+ def peaks(self, start_seek, end_seek):
+ """ read all samples between start_seek and end_seek, then find the minimum and maximum peak
+ in that range. Returns that pair in the order they were found. So if min was found first,
+ it returns (min, max) else the other way around. """
+
+ # larger blocksizes are faster but take more mem...
+ # Aha, Watson, a clue, a tradeof!
+ block_size = 4096
+
+ max_index = -1
+ max_value = -1
+ min_index = -1
+ min_value = 1
+
+ if start_seek < 0:
+ start_seek = 0
+
+ if end_seek > self.audio_file.nframes:
+ end_seek = self.audio_file.nframes
+
+ if end_seek <= start_seek:
+ samples = self.read(start_seek, 1)
+ return (samples[0], samples[0])
+
+ if block_size > end_seek - start_seek:
+ block_size = end_seek - start_seek
+
+ for i in range(start_seek, end_seek, block_size):
+ samples = self.read(i, block_size)
+
+ local_max_index = numpy.argmax(samples)
+ local_max_value = samples[local_max_index]
+
+ if local_max_value > max_value:
+ max_value = local_max_value
+ max_index = local_max_index
+
+ local_min_index = numpy.argmin(samples)
+ local_min_value = samples[local_min_index]
+
+ if local_min_value < min_value:
+ min_value = local_min_value
+ min_index = local_min_index
+
+ return (min_value, max_value) if min_index < max_index else (max_value, min_value)
+
+
+def create_spectrogram_image(source_filename, output_filename,
+ image_size, fft_size, progress_callback=None):
+
+ processor = AudioProcessor(source_filename, fft_size, numpy.hamming)
+ samples_per_pixel = processor.audio_file.nframes / float(image_size[0])
+
+ spectrogram = SpectrogramImage(image_size, fft_size)
+
+ for x in range(image_size[0]):
+ if progress_callback and x % (image_size[0] / 10) == 0:
+ progress_callback((x * 100) / image_size[0])
+
+ seek_point = int(x * samples_per_pixel)
+ next_seek_point = int((x + 1) * samples_per_pixel)
+
+ (spectral_centroid, db_spectrum) = processor.spectral_centroid(seek_point)
+
+ spectrogram.draw_spectrum(x, db_spectrum)
+
+ if progress_callback:
+ progress_callback(100)
+
+ spectrogram.save(output_filename)
+
+
+def interpolate_colors(colors, flat=False, num_colors=256):
+
+ palette = []
+
+ for i in range(num_colors):
+ # TODO: What does this do?
+ index = (
+ (i *
+ (len(colors) - 1) # 7
+ ) # 0..7..14..21..28...
+ /
+ (num_colors - 1.0) # 255.0
+ )
+
+ # TODO: What is the meaning of 'alpha' in this context?
+ alpha = index - round(index)
+
+ channels = list('rgb')
+ values = dict()
+
+ for k, v in zip(range(len(channels)), channels):
+ if alpha > 0:
+ values[v] = (
+ (1.0 - alpha)
+ *
+ colors[int(index)][k]
+ +
+ alpha * colors[int(index) + 1][k]
+ )
+ else:
+ values[v] = (
+ (1.0 - alpha)
+ *
+ colors[int(index)][k]
+ )
+
+ if flat:
+ palette.extend(
+ tuple(int(values[i]) for i in channels))
+ else:
+ palette.append(
+ tuple(int(values[i]) for i in channels))
+
+ return palette
+
+
+def get_max_level(filename):
+ max_value = 0
+ buffer_size = 4096
+ audio_file = audiolab.Sndfile(filename, 'r')
+ n_samples_left = audio_file.nframes
+
+ while n_samples_left:
+ to_read = min(buffer_size, n_samples_left)
+
+ try:
+ samples = audio_file.read_frames(to_read)
+ except RuntimeError:
+ # this can happen with a broken header
+ break
+
+ # convert to mono by selecting left channel only
+ if audio_file.channels > 1:
+ samples = samples[:,0]
+
+ max_value = max(max_value, numpy.abs(samples).max())
+
+ n_samples_left -= to_read
+
+ audio_file.close()
+
+ return max_value
+
+if __name__ == '__main__':
+ import sys
+ sys.argv[4] = int(sys.argv[4])
+ sys.argv[3] = tuple([int(i) for i in sys.argv[3].split('x')])
+
+ create_spectrogram_image(*sys.argv[1:])
diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py
index 32b1f4f7..bdb2290f 100644
--- a/mediagoblin/media_types/image/processing.py
+++ b/mediagoblin/media_types/image/processing.py
@@ -63,11 +63,6 @@ def sniff_handler(media_file, **kw):
name, ext = os.path.splitext(kw['media'].filename)
clean_ext = ext[1:].lower() # Strip the . from ext and make lowercase
- _log.debug('name: {0}\next: {1}\nlower_ext: {2}'.format(
- name,
- ext,
- clean_ext))
-
if clean_ext in SUPPORTED_FILETYPES:
_log.info('Found file extension in supported filetypes')
return True
diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py
index abd14eed..ce47313f 100644
--- a/mediagoblin/media_types/video/processing.py
+++ b/mediagoblin/media_types/video/processing.py
@@ -104,7 +104,10 @@ def process_video(entry):
with tmp_thumb:
# Create a thumbnail.jpg that fits in a 180x180 square
- transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name)
+ transcoders.VideoThumbnailerMarkII(
+ queued_filename,
+ tmp_thumb.name,
+ 180)
# Push the thumbnail to public storage
_log.debug('Saving thumbnail...')
diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py
index 25846ffa..26f96b5f 100644
--- a/mediagoblin/media_types/video/transcoders.py
+++ b/mediagoblin/media_types/video/transcoders.py
@@ -60,12 +60,6 @@ class VideoThumbnailer:
STATE_PROCESSING = 2
# The current thumbnailer state
- state = STATE_NULL
-
- # This will contain the thumbnailing pipeline
- thumbnail_pipeline = None
-
- buffer_probes = {}
def __init__(self, source_path, dest_path):
'''
@@ -78,6 +72,10 @@ class VideoThumbnailer:
into the playbin
- Initialize
'''
+ # This will contain the thumbnailing pipeline
+ self.state = self.STATE_NULL
+ self.thumbnail_pipeline = None
+ self.buffer_probes = {}
self.errors = []
self.source_path = source_path
@@ -332,6 +330,298 @@ class VideoThumbnailer:
self.loop.quit()
+class VideoThumbnailerMarkII(object):
+ '''
+ Creates a thumbnail from a video file. Rewrite of VideoThumbnailer.
+
+ Large parts of the functionality and overall architectue contained within
+ this object is taken from Participatory Culture Foundation's
+ `gst_extractor.Extractor` object last seen at
+ https://github.com/pculture/miro/blob/master/tv/lib/frontends/widgets/gst/gst_extractor.py
+ in the `miro` codebase.
+
+ The `miro` codebase and the gst_extractor.py are licensed under the GNU
+ General Public License v2 or later.
+ '''
+ STATE_NULL = 0
+ STATE_HALTING = 1
+ STATE_PROCESSING = 2
+ STATE_PROCESSING_THUMBNAIL = 3
+
+ def __init__(self, source_path, dest_path, width=None, height=None,
+ position_callback=None):
+ self.state = self.STATE_NULL
+
+ self.has_reached_playbin_pause = False
+
+ self.thumbnail_pipeline = None
+
+ self.permission_to_take_picture = False
+
+ self.buffer_probes = {}
+
+ self.errors = []
+
+ self.source_path = os.path.abspath(source_path)
+ self.dest_path = os.path.abspath(dest_path)
+
+ self.width = width
+ self.height = height
+ self.position_callback = position_callback \
+ or self.wadsworth_position_callback
+
+ self.mainloop = gobject.MainLoop()
+
+ self.playbin = gst.element_factory_make('playbin')
+
+ self.videosink = gst.element_factory_make('fakesink', 'videosink')
+ self.audiosink = gst.element_factory_make('fakesink', 'audiosink')
+
+ self.playbin.set_property('video-sink', self.videosink)
+ self.playbin.set_property('audio-sink', self.audiosink)
+
+ self.playbin_message_bus = self.playbin.get_bus()
+
+ self.playbin_message_bus.add_signal_watch()
+ self.playbin_bus_watch_id = self.playbin_message_bus.connect(
+ 'message',
+ self.on_playbin_message)
+
+ self.playbin.set_property(
+ 'uri',
+ 'file:{0}'.format(
+ urllib.pathname2url(self.source_path)))
+
+ self.playbin.set_state(gst.STATE_PAUSED)
+
+ try:
+ self.run()
+ except Exception as exc:
+ _log.critical(
+ 'Exception "{0}" caught, disconnecting and re-raising'\
+ .format(exc))
+ self.disconnect()
+ raise
+
+ def wadsworth_position_callback(self, duration, gst):
+ return self.duration / 100 * 30
+
+ def run(self):
+ self.mainloop.run()
+
+ def on_playbin_message(self, message_bus, message):
+ _log.debug('playbin message: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ _log.error('playbin error: {0}'.format(message))
+ gobject.idle_add(self.on_playbin_error)
+
+ if message.type == gst.MESSAGE_STATE_CHANGED:
+ prev_state, cur_state, pending_state = \
+ message.parse_state_changed()
+
+ _log.debug('playbin state changed: \nprev: {0}\ncur: {1}\n \
+pending: {2}'.format(
+ prev_state,
+ cur_state,
+ pending_state))
+
+ if cur_state == gst.STATE_PAUSED:
+ if message.src == self.playbin:
+ _log.info('playbin ready')
+ gobject.idle_add(self.on_playbin_paused)
+
+ def on_playbin_paused(self):
+ if self.has_reached_playbin_pause:
+ _log.warn('Has already reached logic for playbin pause. Aborting \
+without doing anything this time.')
+ return False
+
+ self.has_reached_playbin_pause = True
+
+ current_video = self.playbin.get_property('current-video')
+
+ if not current_video:
+ _log.critical('thumbnail could not get any video data \
+from playbin')
+
+ self.duration = self.get_duration(self.playbin)
+ self.permission_to_take_picture = True
+ self.buffer_probes = {}
+
+ pipeline = ''.join([
+ 'filesrc location="%s" ! decodebin ! ' % self.source_path,
+ 'ffmpegcolorspace ! videoscale ! ',
+ 'video/x-raw-rgb,depth=24,bpp=24,pixel-aspect-ratio=1/1',
+ ',width={0}'.format(self.width) if self.width else '',
+ ',height={0}'.format(self.height) if self.height else '',
+ ' ! ',
+ 'fakesink signal-handoffs=True'])
+
+ _log.debug('thumbnail_pipeline: {0}'.format(pipeline))
+
+ self.thumbnail_pipeline = gst.parse_launch(pipeline)
+ self.thumbnail_message_bus = self.thumbnail_pipeline.get_bus()
+ self.thumbnail_message_bus.add_signal_watch()
+ self.thumbnail_bus_watch_id = self.thumbnail_message_bus.connect(
+ 'message',
+ self.on_thumbnail_message)
+
+ self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
+
+ gobject.timeout_add(3000, self.on_gobject_timeout)
+
+ return False
+
+ def on_thumbnail_message(self, message_bus, message):
+ _log.debug('thumbnail message: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ _log.error('thumbnail error: {0}'.format(message))
+ gobject.idle_add(self.on_thumbnail_error)
+
+ if message.type == gst.MESSAGE_STATE_CHANGED:
+ prev_state, cur_state, pending_state = \
+ message.parse_state_changed()
+
+ _log.debug('thumbnail state changed: \nprev: {0}\ncur: {1}\n \
+pending: {2}'.format(
+ prev_state,
+ cur_state,
+ pending_state))
+
+ if cur_state == gst.STATE_PAUSED and\
+ not self.state == self.STATE_PROCESSING_THUMBNAIL:
+ self.state = self.STATE_PROCESSING_THUMBNAIL
+
+ # Find the fakesink sink pad and attach the on_buffer_probe
+ # handler to it.
+ for sink in self.thumbnail_pipeline.sinks():
+ sink_name = sink.get_name()
+ sink_factory_name = sink.get_factory().get_name()
+
+ if sink_factory_name == 'fakesink':
+ sink_pad = sink.get_pad('sink')
+
+ self.buffer_probes[sink_name] = sink_pad\
+ .add_buffer_probe(
+ self.on_pad_buffer_probe,
+ sink_name)
+
+ _log.info('Attached buffer probes: {0}'.format(
+ self.buffer_probes))
+
+ break
+
+ seek_amount = self.position_callback(self.duration, gst)
+
+ seek_result = self.thumbnail_pipeline.seek(
+ 1.0,
+ gst.FORMAT_TIME,
+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
+ gst.SEEK_TYPE_SET,
+ seek_amount,
+ gst.SEEK_TYPE_NONE,
+ 0)
+
+ if not seek_result:
+ _log.critical('Could not seek.')
+
+ elif self.state == self.STATE_PROCESSING_THUMBNAIL:
+ _log.debug('Already processing thumbnail')
+
+ def on_pad_buffer_probe(self, *args):
+ _log.debug('buffer probe handler: {0}'.format(args))
+ gobject.idle_add(lambda: self.take_snapshot(*args))
+
+ def take_snapshot(self, pad, buff, name):
+ if self.state == self.STATE_HALTING:
+ _log.debug('Pipeline is halting, will not take snapshot')
+ return False
+
+ _log.info('Taking snapshot! ({0})'.format(
+ (pad, buff, name)))
+ try:
+ caps = buff.caps
+ if caps is None:
+ _log.error('No buffer caps present /take_snapshot')
+ self.disconnect()
+
+ _log.debug('caps: {0}'.format(caps))
+
+ filters = caps[0]
+ width = filters['width']
+ height = filters['height']
+
+ im = Image.new('RGB', (width, height))
+
+ data = pixbuf_to_pilbuf(buff.data)
+
+ im.putdata(data)
+
+ im.save(self.dest_path)
+
+ _log.info('Saved snapshot!')
+
+ self.disconnect()
+
+ except gst.QueryError as exc:
+ _log.error('take_snapshot - QueryError: {0}'.format(exc))
+
+ return False
+
+ def on_thumbnail_error(self):
+ _log.error('Thumbnailing failed.')
+ self.disconnect()
+
+ def disconnect(self):
+ self.state = self.STATE_HALTING
+
+ if self.playbin is not None:
+ self.playbin.set_state(gst.STATE_NULL)
+
+ for sink in self.playbin.sinks():
+ sink_name = sink.get_name()
+ sink_factory_name = sink.get_factory().get_name()
+
+ if sink_factory_name == 'fakesink':
+ sink_pad = sink.get_pad('sink')
+ sink_pad.remove_buffer_probe(self.buffer_probes[sink_name])
+ del self.buffer_probes[sink_name]
+
+ self.playbin = None
+
+ if self.thumbnail_pipeline is not None:
+ self.thumbnail_pipeline.set_state(gst.STATE_NULL)
+ self.thumbnail_pipeline = None
+
+ if self.playbin_message_bus is not None:
+ self.playbin_message_bus.disconnect(self.playbin_bus_watch_id)
+ self.playbin_message_bus = None
+
+ self.halt()
+
+ def halt(self):
+ gobject.idle_add(self.mainloop.quit)
+
+ def on_gobject_timeout(self):
+ _log.critical('Reached gobject timeout')
+ self.disconnect()
+
+ def get_duration(self, pipeline, attempt=1):
+ if attempt == 5:
+ _log.critical('Pipeline duration query retry limit reached.')
+ return 0
+
+ try:
+ return pipeline.query_duration(gst.FORMAT_TIME)[0]
+ except gst.QueryError as exc:
+ _log.error('Could not get duration on attempt {0}: {1}'.format(
+ attempt,
+ exc))
+ return self.get_duration(pipeline, attempt + 1)
+
+
class VideoTranscoder:
'''
Video transcoder
@@ -709,7 +999,7 @@ if __name__ == '__main__':
transcoder = VideoTranscoder()
if options.action == 'thumbnail':
- VideoThumbnailer(*args)
+ VideoThumbnailerMarkII(*args)
elif options.action == 'video':
def cb(data):
print('I\'m a callback!')
diff --git a/mediagoblin/plugins/api/__init__.py b/mediagoblin/plugins/api/__init__.py
index 40722088..d3fdf2ef 100644
--- a/mediagoblin/plugins/api/__init__.py
+++ b/mediagoblin/plugins/api/__init__.py
@@ -17,8 +17,6 @@
import os
import logging
-from routes.route import Route
-
from mediagoblin.tools import pluginapi
_log = logging.getLogger(__name__)
@@ -33,12 +31,15 @@ def setup_plugin():
_log.debug('API config: {0}'.format(config))
routes = [
- Route('mediagoblin.plugins.api.test', '/api/test',
- controller='mediagoblin.plugins.api.views:api_test'),
- Route('mediagoblin.plugins.api.entries', '/api/entries',
- controller='mediagoblin.plugins.api.views:get_entries'),
- Route('mediagoblin.plugins.api.post_entry', '/api/submit',
- controller='mediagoblin.plugins.api.views:post_entry')]
+ ('mediagoblin.plugins.api.test',
+ '/api/test',
+ 'mediagoblin.plugins.api.views:api_test'),
+ ('mediagoblin.plugins.api.entries',
+ '/api/entries',
+ 'mediagoblin.plugins.api.views:get_entries'),
+ ('mediagoblin.plugins.api.post_entry',
+ '/api/submit',
+ 'mediagoblin.plugins.api.views:post_entry')]
pluginapi.register_routes(routes)
diff --git a/mediagoblin/plugins/api/tools.py b/mediagoblin/plugins/api/tools.py
index c4630ba7..ecc50364 100644
--- a/mediagoblin/plugins/api/tools.py
+++ b/mediagoblin/plugins/api/tools.py
@@ -52,7 +52,7 @@ class Auth(object):
raise NotImplemented()
-def json_response(serializable, *args, **kw):
+def json_response(serializable, _disable_cors=False, *args, **kw):
'''
Serializes a json objects and returns a webob.Response object with the
serialized value as the response body and Content-Type: application/json.
@@ -64,11 +64,14 @@ def json_response(serializable, *args, **kw):
'''
response = Response(json.dumps(serializable), *args, **kw)
response.headers['Content-Type'] = 'application/json'
- cors_headers = {
- 'Access-Control-Allow-Origin': '*',
- 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
- 'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With'}
- response.headers.update(cors_headers)
+
+ if not _disable_cors:
+ cors_headers = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
+ 'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With'}
+ response.headers.update(cors_headers)
+
return response
@@ -149,6 +152,11 @@ def api_auth(controller):
auth, request.url))
if not auth(request, *args, **kw):
+ if getattr(auth, 'errors', []):
+ return json_response({
+ 'status': 403,
+ 'errors': auth.errors})
+
return exc.HTTPForbidden()
return controller(request, *args, **kw)
diff --git a/mediagoblin/plugins/api/views.py b/mediagoblin/plugins/api/views.py
index d537ec6e..a1b1bcac 100644
--- a/mediagoblin/plugins/api/views.py
+++ b/mediagoblin/plugins/api/views.py
@@ -20,8 +20,8 @@ import uuid
from os.path import splitext
from webob import exc, Response
-from cgi import FieldStorage
from werkzeug.utils import secure_filename
+from werkzeug.datastructures import FileStorage
from celery import registry
from mediagoblin.db.util import ObjectId
@@ -29,13 +29,10 @@ from mediagoblin.decorators import require_active_login
from mediagoblin.processing import mark_entry_failed
from mediagoblin.processing.task import ProcessMedia
from mediagoblin.meddleware.csrf import csrf_exempt
-from mediagoblin.media_types import sniff_media, InvalidFileType, \
- FileTypeNotSupported
+from mediagoblin.media_types import sniff_media
from mediagoblin.plugins.api.tools import api_auth, get_entry_serializable, \
json_response
-from mediagoblin.plugins.api import config
-
_log = logging.getLogger(__name__)
@@ -52,24 +49,24 @@ def post_entry(request):
_log.debug('Must POST against post_entry')
return exc.HTTPBadRequest()
- if not 'file' in request.POST \
- or not isinstance(request.POST['file'], FieldStorage) \
- or not request.POST['file'].file:
+ if not 'file' in request.files \
+ or not isinstance(request.files['file'], FileStorage) \
+ or not request.files['file'].stream:
_log.debug('File field not found')
return exc.HTTPBadRequest()
- media_file = request.POST['file']
+ media_file = request.files['file']
media_type, media_manager = sniff_media(media_file)
entry = request.db.MediaEntry()
entry.id = ObjectId()
entry.media_type = unicode(media_type)
- entry.title = unicode(request.POST.get('title')
+ entry.title = unicode(request.form.get('title')
or splitext(media_file.filename)[0])
- entry.description = unicode(request.POST.get('description'))
- entry.license = unicode(request.POST.get('license', ''))
+ entry.description = unicode(request.form.get('description'))
+ entry.license = unicode(request.form.get('license', ''))
entry.uploader = request.user.id
@@ -88,7 +85,7 @@ def post_entry(request):
queue_filepath, 'wb')
with queue_file:
- queue_file.write(request.POST['file'].file.read())
+ queue_file.write(request.files['file'].stream.read())
# Add queued filename to the entry
entry.queued_media_file = queue_filepath
@@ -98,6 +95,12 @@ def post_entry(request):
# Save now so we have this data before kicking off processing
entry.save(validate=True)
+ if request.form.get('callback_url'):
+ metadata = request.db.ProcessingMetaData()
+ metadata.media_entry = entry
+ metadata.callback_url = unicode(request.form['callback_url'])
+ metadata.save()
+
# Pass off to processing
#
# (... don't change entry after this point to avoid race
diff --git a/mediagoblin/plugins/flatpagesfile/__init__.py b/mediagoblin/plugins/flatpagesfile/__init__.py
index b9b52012..3d797809 100644
--- a/mediagoblin/plugins/flatpagesfile/__init__.py
+++ b/mediagoblin/plugins/flatpagesfile/__init__.py
@@ -19,7 +19,6 @@ import logging
import os
import jinja2
-from routes.route import Route
from mediagoblin.tools import pluginapi
from mediagoblin.tools.response import render_to_response
@@ -68,7 +67,7 @@ def setup_plugin():
name = 'flatpagesfile.%s' % name.strip()
controller = flatpage_handler_builder(template)
routes.append(
- Route(name, url, controller=controller))
+ (name, url, controller))
pluginapi.register_routes(routes)
_log.info('Done setting up flatpagesfile!')
diff --git a/mediagoblin/plugins/httpapiauth/__init__.py b/mediagoblin/plugins/httpapiauth/__init__.py
new file mode 100644
index 00000000..d3d2065e
--- /dev/null
+++ b/mediagoblin/plugins/httpapiauth/__init__.py
@@ -0,0 +1,58 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import base64
+
+from werkzeug.exceptions import BadRequest, Unauthorized
+
+from mediagoblin.plugins.api.tools import Auth
+
+_log = logging.getLogger(__name__)
+
+
+def setup_http_api_auth():
+ _log.info('Setting up HTTP API Auth...')
+
+
+class HTTPAuth(Auth):
+ def trigger(self, request):
+ if request.authorization:
+ return True
+
+ return False
+
+ def __call__(self, request, *args, **kw):
+ _log.debug('Trying to authorize the user agent via HTTP Auth')
+ if not request.authorization:
+ return False
+
+ user = request.db.User.query.filter_by(
+ username=request.authorization['username']).first()
+
+ if user.check_login(request.authorization['password']):
+ request.user = user
+ return True
+ else:
+ raise Unauthorized()
+
+ return False
+
+
+
+hooks = {
+ 'setup': setup_http_api_auth,
+ 'auth': HTTPAuth()}
diff --git a/mediagoblin/plugins/oauth/README.rst b/mediagoblin/plugins/oauth/README.rst
index e5a1dc3a..405a67e2 100644
--- a/mediagoblin/plugins/oauth/README.rst
+++ b/mediagoblin/plugins/oauth/README.rst
@@ -122,20 +122,23 @@ Capabilities
- `Authorization endpoint`_ - Located at ``/oauth/authorize``
- `Token endpoint`_ - Located at ``/oauth/access_token``
- `Authorization Code Grant`_
+- `Client Registration`_
.. _`Authorization endpoint`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.1
.. _`Token endpoint`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.2
.. _`Authorization Code Grant`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-4.1
+.. _`Client Registration`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-2
Incapabilities
==============
-- `Client Registration`_ - `planned feature
- <http://issues.mediagoblin.org/ticket/497>`_
-- `Access Token Scope`_
+- Only `bearer tokens`_ are issued.
- `Implicit Grant`_
+- `Force TLS for token endpoint`_ - This one is up the the siteadmin
+- Authorization `scope`_ and `state`
- ...
-.. _`Client Registration`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-2
-.. _`Access Token Scope`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.3
+.. _`bearer tokens`: http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-08
+.. _`scope`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.3
.. _`Implicit Grant`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-4.2
+.. _`Force TLS for token endpoint`: http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-3.2
diff --git a/mediagoblin/plugins/oauth/__init__.py b/mediagoblin/plugins/oauth/__init__.py
index 33dcaf16..4714d95d 100644
--- a/mediagoblin/plugins/oauth/__init__.py
+++ b/mediagoblin/plugins/oauth/__init__.py
@@ -17,12 +17,9 @@
import os
import logging
-from routes.route import Route
-from webob import exc
-
from mediagoblin.tools import pluginapi
-from mediagoblin.tools.response import render_to_response
-from mediagoblin.plugins.oauth.models import OAuthToken
+from mediagoblin.plugins.oauth.models import OAuthToken, OAuthClient, \
+ OAuthUserClient
from mediagoblin.plugins.api.tools import Auth
_log = logging.getLogger(__name__)
@@ -37,10 +34,24 @@ def setup_plugin():
_log.debug('OAuth config: {0}'.format(config))
routes = [
- Route('mediagoblin.plugins.oauth.authorize', '/oauth/authorize',
- controller='mediagoblin.plugins.oauth.views:authorize'),
- Route('mediagoblin.plugins.oauth.access_token', '/oauth/access_token',
- controller='mediagoblin.plugins.oauth.views:access_token')]
+ ('mediagoblin.plugins.oauth.authorize',
+ '/oauth/authorize',
+ 'mediagoblin.plugins.oauth.views:authorize'),
+ ('mediagoblin.plugins.oauth.authorize_client',
+ '/oauth/client/authorize',
+ 'mediagoblin.plugins.oauth.views:authorize_client'),
+ ('mediagoblin.plugins.oauth.access_token',
+ '/oauth/access_token',
+ 'mediagoblin.plugins.oauth.views:access_token'),
+ ('mediagoblin.plugins.oauth.list_connections',
+ '/oauth/client/connections',
+ 'mediagoblin.plugins.oauth.views:list_connections'),
+ ('mediagoblin.plugins.oauth.register_client',
+ '/oauth/client/register',
+ 'mediagoblin.plugins.oauth.views:register_client'),
+ ('mediagoblin.plugins.oauth.list_clients',
+ '/oauth/client/list',
+ 'mediagoblin.plugins.oauth.views:list_clients')]
pluginapi.register_routes(routes)
pluginapi.register_template_path(os.path.join(PLUGIN_DIR, 'templates'))
@@ -54,17 +65,42 @@ class OAuthAuth(Auth):
return False
def __call__(self, request, *args, **kw):
+ self.errors = []
+ # TODO: Add suport for client credentials authorization
+ client_id = request.GET.get('client_id') # TODO: Not used
+ client_secret = request.GET.get('client_secret') # TODO: Not used
access_token = request.GET.get('access_token')
+
+ _log.debug('Authorizing request {0}'.format(request.url))
+
if access_token:
token = OAuthToken.query.filter(OAuthToken.token == access_token)\
.first()
if not token:
+ self.errors.append('Invalid access token')
+ return False
+
+ _log.debug('Access token: {0}'.format(token))
+ _log.debug('Client: {0}'.format(token.client))
+
+ relation = OAuthUserClient.query.filter(
+ (OAuthUserClient.user == token.user)
+ & (OAuthUserClient.client == token.client)
+ & (OAuthUserClient.state == u'approved')).first()
+
+ _log.debug('Relation: {0}'.format(relation))
+
+ if not relation:
+ self.errors.append(
+ u'Client has not been approved by the resource owner')
return False
request.user = token.user
return True
+ self.errors.append(u'No access_token specified')
+
return False
hooks = {
diff --git a/mediagoblin/plugins/oauth/forms.py b/mediagoblin/plugins/oauth/forms.py
new file mode 100644
index 00000000..2a956dad
--- /dev/null
+++ b/mediagoblin/plugins/oauth/forms.py
@@ -0,0 +1,70 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import wtforms
+
+from urlparse import urlparse
+
+from mediagoblin.tools.extlib.wtf_html5 import URLField
+from mediagoblin.tools.translate import fake_ugettext_passthrough as _
+
+
+class AuthorizationForm(wtforms.Form):
+ client_id = wtforms.HiddenField(_(u'Client ID'),
+ [wtforms.validators.Required()])
+ next = wtforms.HiddenField(_(u'Next URL'),
+ [wtforms.validators.Required()])
+ allow = wtforms.SubmitField(_(u'Allow'))
+ deny = wtforms.SubmitField(_(u'Deny'))
+
+
+class ClientRegistrationForm(wtforms.Form):
+ name = wtforms.TextField(_('Name'), [wtforms.validators.Required()],
+ description=_('The name of the OAuth client'))
+ description = wtforms.TextAreaField(_('Description'),
+ [wtforms.validators.Length(min=0, max=500)],
+ description=_('''This will be visible to users allowing your
+ application to authenticate as them.'''))
+ type = wtforms.SelectField(_('Type'),
+ [wtforms.validators.Required()],
+ choices=[
+ ('confidential', 'Confidential'),
+ ('public', 'Public')],
+ description=_('''<strong>Confidential</strong> - The client can
+ make requests to the GNU MediaGoblin instance that can not be
+ intercepted by the user agent (e.g. server-side client).<br />
+ <strong>Public</strong> - The client can't make confidential
+ requests to the GNU MediaGoblin instance (e.g. client-side
+ JavaScript client).'''))
+
+ redirect_uri = URLField(_('Redirect URI'),
+ [wtforms.validators.Optional(), wtforms.validators.URL()],
+ description=_('''The redirect URI for the applications, this field
+ is <strong>required</strong> for public clients.'''))
+
+ def __init__(self, *args, **kw):
+ wtforms.Form.__init__(self, *args, **kw)
+
+ def validate(self):
+ if not wtforms.Form.validate(self):
+ return False
+
+ if self.type.data == 'public' and not self.redirect_uri.data:
+ self.redirect_uri.errors.append(
+ _('This field is required for public clients'))
+ return False
+
+ return True
diff --git a/mediagoblin/plugins/oauth/migrations.py b/mediagoblin/plugins/oauth/migrations.py
new file mode 100644
index 00000000..f2af3907
--- /dev/null
+++ b/mediagoblin/plugins/oauth/migrations.py
@@ -0,0 +1,46 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from sqlalchemy import MetaData, Table
+
+from mediagoblin.db.sql.util import RegisterMigration
+
+from mediagoblin.plugins.oauth.models import OAuthClient, OAuthToken, \
+ OAuthUserClient, OAuthCode
+
+MIGRATIONS = {}
+
+
+@RegisterMigration(1, MIGRATIONS)
+def remove_and_replace_token_and_code(db):
+ metadata = MetaData(bind=db.bind)
+
+ token_table = Table('oauth__tokens', metadata, autoload=True,
+ autoload_with=db.bind)
+
+ token_table.drop()
+
+ code_table = Table('oauth__codes', metadata, autoload=True,
+ autoload_with=db.bind)
+
+ code_table.drop()
+
+ OAuthClient.__table__.create(db.bind)
+ OAuthUserClient.__table__.create(db.bind)
+ OAuthToken.__table__.create(db.bind)
+ OAuthCode.__table__.create(db.bind)
+
+ db.commit()
diff --git a/mediagoblin/plugins/oauth/models.py b/mediagoblin/plugins/oauth/models.py
index 295987c8..7e247c1a 100644
--- a/mediagoblin/plugins/oauth/models.py
+++ b/mediagoblin/plugins/oauth/models.py
@@ -14,15 +14,86 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import uuid
+import bcrypt
+
from datetime import datetime, timedelta
from mediagoblin.db.sql.base import Base
from mediagoblin.db.sql.models import User
from sqlalchemy import (
- Column, Unicode, Integer, DateTime, ForeignKey)
+ Column, Unicode, Integer, DateTime, ForeignKey, Enum)
from sqlalchemy.orm import relationship
+# Don't remove this, I *think* it applies sqlalchemy-migrate functionality onto
+# the models.
+from migrate import changeset
+
+
+class OAuthClient(Base):
+ __tablename__ = 'oauth__client'
+
+ id = Column(Integer, primary_key=True)
+ created = Column(DateTime, nullable=False,
+ default=datetime.now)
+
+ name = Column(Unicode)
+ description = Column(Unicode)
+
+ identifier = Column(Unicode, unique=True, index=True)
+ secret = Column(Unicode, index=True)
+
+ owner_id = Column(Integer, ForeignKey(User.id))
+ owner = relationship(User, backref='registered_clients')
+
+ redirect_uri = Column(Unicode)
+
+ type = Column(Enum(
+ u'confidential',
+ u'public',
+ name=u'oauth__client_type'))
+
+ def generate_identifier(self):
+ self.identifier = unicode(uuid.uuid4())
+
+ def generate_secret(self):
+ self.secret = unicode(
+ bcrypt.hashpw(
+ unicode(uuid.uuid4()),
+ bcrypt.gensalt()))
+
+ def __repr__(self):
+ return '<{0} {1}:{2} ({3})>'.format(
+ self.__class__.__name__,
+ self.id,
+ self.name.encode('ascii', 'replace'),
+ self.owner.username.encode('ascii', 'replace'))
+
+
+class OAuthUserClient(Base):
+ __tablename__ = 'oauth__user_client'
+ id = Column(Integer, primary_key=True)
+
+ user_id = Column(Integer, ForeignKey(User.id))
+ user = relationship(User, backref='oauth_clients')
+
+ client_id = Column(Integer, ForeignKey(OAuthClient.id))
+ client = relationship(OAuthClient, backref='users')
+
+ state = Column(Enum(
+ u'approved',
+ u'rejected',
+ name=u'oauth__relation_state'))
+
+ def __repr__(self):
+ return '<{0} #{1} {2} [{3}, {4}]>'.format(
+ self.__class__.__name__,
+ self.id,
+ self.state.encode('ascii', 'replace'),
+ self.user,
+ self.client)
+
class OAuthToken(Base):
__tablename__ = 'oauth__tokens'
@@ -39,6 +110,17 @@ class OAuthToken(Base):
index=True)
user = relationship(User)
+ client_id = Column(Integer, ForeignKey(OAuthClient.id), nullable=False)
+ client = relationship(OAuthClient)
+
+ def __repr__(self):
+ return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
+ self.__class__.__name__,
+ self.id,
+ self.expires.isoformat(),
+ self.user,
+ self.client)
+
class OAuthCode(Base):
__tablename__ = 'oauth__codes'
@@ -54,5 +136,20 @@ class OAuthCode(Base):
index=True)
user = relationship(User)
+ client_id = Column(Integer, ForeignKey(OAuthClient.id), nullable=False)
+ client = relationship(OAuthClient)
+
+ def __repr__(self):
+ return '<{0} #{1} expires {2} [{3}, {4}]>'.format(
+ self.__class__.__name__,
+ self.id,
+ self.expires.isoformat(),
+ self.user,
+ self.client)
+
-MODELS = [OAuthToken, OAuthCode]
+MODELS = [
+ OAuthToken,
+ OAuthCode,
+ OAuthClient,
+ OAuthUserClient]
diff --git a/mediagoblin/plugins/oauth/templates/oauth/authorize.html b/mediagoblin/plugins/oauth/templates/oauth/authorize.html
new file mode 100644
index 00000000..647fa41f
--- /dev/null
+++ b/mediagoblin/plugins/oauth/templates/oauth/authorize.html
@@ -0,0 +1,31 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#, se, seee
+# 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/>.
+-#}
+{% extends "mediagoblin/base.html" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_content %}
+<form action="{{ request.urlgen('mediagoblin.plugins.oauth.authorize_client') }}"
+ method="POST">
+ <div class="form_box_xl">
+ {{ csrf_token }}
+ <h2>Authorize {{ client.name }}?</h2>
+ <p class="client-description">{{ client.description }}</p>
+ {{ wtforms_util.render_divs(form) }}
+ </div>
+</form>
+{% endblock %}
diff --git a/mediagoblin/plugins/oauth/templates/oauth/client/connections.html b/mediagoblin/plugins/oauth/templates/oauth/client/connections.html
new file mode 100644
index 00000000..63b0230a
--- /dev/null
+++ b/mediagoblin/plugins/oauth/templates/oauth/client/connections.html
@@ -0,0 +1,34 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+{% extends "mediagoblin/base.html" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_content %}
+<h1>{% trans %}OAuth client connections{% endtrans %}</h1>
+{% if connections %}
+<ul>
+ {% for connection in connections %}
+ <li><span title="{{ connection.client.description }}">{{
+ connection.client.name }}</span> - {{ connection.state }}
+ </li>
+ {% endfor %}
+</ul>
+{% else %}
+<p>You haven't connected using an OAuth client before.</p>
+{% endif %}
+{% endblock %}
diff --git a/mediagoblin/plugins/oauth/templates/oauth/client/list.html b/mediagoblin/plugins/oauth/templates/oauth/client/list.html
new file mode 100644
index 00000000..21024bb7
--- /dev/null
+++ b/mediagoblin/plugins/oauth/templates/oauth/client/list.html
@@ -0,0 +1,45 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+{% extends "mediagoblin/base.html" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_content %}
+<h1>{% trans %}Your OAuth clients{% endtrans %}</h1>
+{% if clients %}
+<ul>
+ {% for client in clients %}
+ <li>{{ client.name }}
+ <dl>
+ <dt>Type</dt>
+ <dd>{{ client.type }}</dd>
+ <dt>Description</dt>
+ <dd>{{ client.description }}</dd>
+ <dt>Identifier</dt>
+ <dd>{{ client.identifier }}</dd>
+ <dt>Secret</dt>
+ <dd>{{ client.secret }}</dd>
+ <dt>Redirect URI<dt>
+ <dd>{{ client.redirect_uri }}</dd>
+ </dl>
+ </li>
+ {% endfor %}
+</ul>
+{% else %}
+<p>You don't have any clients yet. <a href="{{ request.urlgen('mediagoblin.plugins.oauth.register_client') }}">Add one</a>.</p>
+{% endif %}
+{% endblock %}
diff --git a/mediagoblin/plugins/oauth/templates/oauth/client/register.html b/mediagoblin/plugins/oauth/templates/oauth/client/register.html
new file mode 100644
index 00000000..6fd700d3
--- /dev/null
+++ b/mediagoblin/plugins/oauth/templates/oauth/client/register.html
@@ -0,0 +1,34 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+{% extends "mediagoblin/base.html" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_content %}
+<form action="{{ request.urlgen('mediagoblin.plugins.oauth.register_client') }}"
+ method="POST">
+ <div class="form_box_xl">
+ <h1>Register OAuth client</h1>
+ {{ wtforms_util.render_divs(form) }}
+ <div class="form_submit_buttons">
+ {{ csrf_token }}
+ <input type="submit" value="{% trans %}Add{% endtrans %}"
+ class="button_form" />
+ </div>
+ </div>
+</form>
+{% endblock %}
diff --git a/mediagoblin/plugins/oauth/tools.py b/mediagoblin/plugins/oauth/tools.py
new file mode 100644
index 00000000..d21c8a5b
--- /dev/null
+++ b/mediagoblin/plugins/oauth/tools.py
@@ -0,0 +1,43 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from functools import wraps
+
+from mediagoblin.plugins.oauth.models import OAuthClient
+from mediagoblin.plugins.api.tools import json_response
+
+
+def require_client_auth(controller):
+ @wraps(controller)
+ def wrapper(request, *args, **kw):
+ if not request.GET.get('client_id'):
+ return json_response({
+ 'status': 400,
+ 'errors': [u'No client identifier in URL']},
+ _disable_cors=True)
+
+ client = OAuthClient.query.filter(
+ OAuthClient.identifier == request.GET.get('client_id')).first()
+
+ if not client:
+ return json_response({
+ 'status': 400,
+ 'errors': [u'No such client identifier']},
+ _disable_cors=True)
+
+ return controller(request, client)
+
+ return wrapper
diff --git a/mediagoblin/plugins/oauth/views.py b/mediagoblin/plugins/oauth/views.py
index 70be3039..cf605fd2 100644
--- a/mediagoblin/plugins/oauth/views.py
+++ b/mediagoblin/plugins/oauth/views.py
@@ -21,38 +21,142 @@ from webob import exc, Response
from urllib import urlencode
from uuid import uuid4
from datetime import datetime
-from functools import wraps
-from mediagoblin.tools import pluginapi
-from mediagoblin.tools.response import render_to_response
+from mediagoblin.tools.response import render_to_response, redirect
from mediagoblin.decorators import require_active_login
from mediagoblin.messages import add_message, SUCCESS, ERROR
from mediagoblin.tools.translate import pass_to_ugettext as _
-from mediagoblin.plugins.oauth.models import OAuthCode, OAuthToken
+from mediagoblin.plugins.oauth.models import OAuthCode, OAuthToken, \
+ OAuthClient, OAuthUserClient
+from mediagoblin.plugins.oauth.forms import ClientRegistrationForm, \
+ AuthorizationForm
+from mediagoblin.plugins.oauth.tools import require_client_auth
+from mediagoblin.plugins.api.tools import json_response
_log = logging.getLogger(__name__)
@require_active_login
-def authorize(request):
- # TODO: Check if allowed
+def register_client(request):
+ '''
+ Register an OAuth client
+ '''
+ form = ClientRegistrationForm(request.form)
- # Client is allowed by the user
- if True or already_authorized:
- # Generate a code
- # Save the code, the client will later use it to obtain an access token
- # Redirect the user agent to the redirect_uri with the code
+ if request.method == 'POST' and form.validate():
+ client = OAuthClient()
+ client.name = unicode(request.form['name'])
+ client.description = unicode(request.form['description'])
+ client.type = unicode(request.form['type'])
+ client.owner_id = request.user.id
+ client.redirect_uri = unicode(request.form['redirect_uri'])
- if not 'redirect_uri' in request.GET:
- add_message(request, ERROR, _('No redirect_uri found'))
+ client.generate_identifier()
+ client.generate_secret()
+
+ client.save()
+
+ add_message(request, SUCCESS, _('The client {0} has been registered!')\
+ .format(
+ client.name))
+
+ return redirect(request, 'mediagoblin.plugins.oauth.list_clients')
+
+ return render_to_response(
+ request,
+ 'oauth/client/register.html',
+ {'form': form})
+
+
+@require_active_login
+def list_clients(request):
+ clients = request.db.OAuthClient.query.filter(
+ OAuthClient.owner_id == request.user.id).all()
+ return render_to_response(request, 'oauth/client/list.html',
+ {'clients': clients})
+
+
+@require_active_login
+def list_connections(request):
+ connections = OAuthUserClient.query.filter(
+ OAuthUserClient.user == request.user).all()
+ return render_to_response(request, 'oauth/client/connections.html',
+ {'connections': connections})
+
+
+@require_active_login
+def authorize_client(request):
+ form = AuthorizationForm(request.form)
+
+ client = OAuthClient.query.filter(OAuthClient.id ==
+ form.client_id.data).first()
+
+ if not client:
+ _log.error('''No such client id as received from client authorization
+ form.''')
+ return exc.HTTPBadRequest()
+
+ if form.validate():
+ relation = OAuthUserClient()
+ relation.user_id = request.user.id
+ relation.client_id = form.client_id.data
+ if form.allow.data:
+ relation.state = u'approved'
+ elif form.deny.data:
+ relation.state = u'rejected'
+ else:
+ return exc.HTTPBadRequest
+
+ relation.save()
+
+ return exc.HTTPFound(location=form.next.data)
+
+ return render_to_response(
+ request,
+ 'oauth/authorize.html',
+ {'form': form,
+ 'client': client})
+
+
+@require_client_auth
+@require_active_login
+def authorize(request, client):
+ # TODO: Get rid of the JSON responses in this view, it's called by the
+ # user-agent, not the client.
+ user_client_relation = OAuthUserClient.query.filter(
+ (OAuthUserClient.user == request.user)
+ & (OAuthUserClient.client == client))
+
+ if user_client_relation.filter(OAuthUserClient.state ==
+ u'approved').count():
+ redirect_uri = None
+
+ if client.type == u'public':
+ if not client.redirect_uri:
+ return json_response({
+ 'status': 400,
+ 'errors':
+ [u'Public clients MUST have a redirect_uri pre-set']},
+ _disable_cors=True)
+
+ redirect_uri = client.redirect_uri
+
+ if client.type == u'confidential':
+ redirect_uri = request.GET.get('redirect_uri', client.redirect_uri)
+ if not redirect_uri:
+ return json_response({
+ 'status': 400,
+ 'errors': [u'Can not find a redirect_uri for client: {0}'\
+ .format(client.name)]}, _disable_cors=True)
code = OAuthCode()
code.code = unicode(uuid4())
code.user = request.user
+ code.client = client
code.save()
redirect_uri = ''.join([
- request.GET.get('redirect_uri'),
+ redirect_uri,
'?',
urlencode({'code': code.code})])
@@ -65,29 +169,67 @@ def authorize(request):
# code parameter
# - on deny: send the user agent back to the redirect uri with error
# information
- pass
- return render_to_response(request, 'oauth/base.html', {})
+ form = AuthorizationForm(request.form)
+ form.client_id.data = client.id
+ form.next.data = request.url
+ return render_to_response(
+ request,
+ 'oauth/authorize.html',
+ {'form': form,
+ 'client': client})
def access_token(request):
if request.GET.get('code'):
- code = OAuthCode.query.filter(OAuthCode.code == request.GET.get('code'))\
- .first()
+ code = OAuthCode.query.filter(OAuthCode.code ==
+ request.GET.get('code')).first()
if code:
+ if code.client.type == u'confidential':
+ client_identifier = request.GET.get('client_id')
+
+ if not client_identifier:
+ return json_response({
+ 'error': 'invalid_request',
+ 'error_description':
+ 'Missing client_id in request'})
+
+ client_secret = request.GET.get('client_secret')
+
+ if not client_secret:
+ return json_response({
+ 'error': 'invalid_request',
+ 'error_description':
+ 'Missing client_secret in request'})
+
+ if not client_secret == code.client.secret or \
+ not client_identifier == code.client.identifier:
+ return json_response({
+ 'error': 'invalid_client',
+ 'error_description':
+ 'The client_id or client_secret does not match the'
+ ' code'})
+
token = OAuthToken()
token.token = unicode(uuid4())
token.user = code.user
+ token.client = code.client
token.save()
access_token_data = {
'access_token': token.token,
- 'token_type': 'what_do_i_use_this_for', # TODO
- 'expires_in':
- (token.expires - datetime.now()).total_seconds(),
- 'refresh_token': 'This should probably be safe'}
- return Response(json.dumps(access_token_data))
-
- error_data = {
- 'error': 'Incorrect code'}
- return Response(json.dumps(error_data))
+ 'token_type': 'bearer',
+ 'expires_in': int(
+ round(
+ (token.expires - datetime.now()).total_seconds()))}
+ return json_response(access_token_data, _disable_cors=True)
+ else:
+ return json_response({
+ 'error': 'invalid_request',
+ 'error_description':
+ 'Invalid code'})
+ else:
+ return json_response({
+ 'error': 'invalid_request',
+ 'error_descriptin':
+ 'Missing `code` parameter in request'})
diff --git a/mediagoblin/processing/task.py b/mediagoblin/processing/task.py
index e46d2dfd..187b893d 100644
--- a/mediagoblin/processing/task.py
+++ b/mediagoblin/processing/task.py
@@ -22,6 +22,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.db.util import ObjectId
from mediagoblin.media_types import get_media_manager
from mediagoblin.processing import mark_entry_failed, BaseProcessingFail
+from mediagoblin.tools.processing import json_processing_callback
_log = logging.getLogger(__name__)
logging.basicConfig()
@@ -58,8 +59,10 @@ class ProcessMedia(Task):
entry.state = u'processed'
entry.save()
+ json_processing_callback(entry)
except BaseProcessingFail as exc:
mark_entry_failed(entry._id, exc)
+ json_processing_callback(entry)
return
except ImportError as exc:
@@ -70,6 +73,7 @@ class ProcessMedia(Task):
exc))
mark_entry_failed(entry._id, exc)
+ json_processing_callback(entry)
except Exception as exc:
_log.error('An unhandled exception was raised while'
@@ -77,6 +81,7 @@ class ProcessMedia(Task):
entry))
mark_entry_failed(entry._id, exc)
+ json_processing_callback(entry)
raise
def on_failure(self, exc, task_id, args, kwargs, einfo):
@@ -90,3 +95,6 @@ class ProcessMedia(Task):
"""
entry_id = args[0]
mark_entry_failed(entry_id, exc)
+
+ entry = mgg.database.MediaEntry.query.filter_by(id=entry_id).first()
+ json_processing_callback(entry)
diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py
index 90e1f3f8..defbc4ba 100644
--- a/mediagoblin/routing.py
+++ b/mediagoblin/routing.py
@@ -14,36 +14,42 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes import Mapper
+from werkzeug.routing import Map, Rule
-from mediagoblin.auth.routing import auth_routes
-from mediagoblin.submit.routing import submit_routes
-from mediagoblin.user_pages.routing import user_routes
-from mediagoblin.edit.routing import edit_routes
-from mediagoblin.listings.routing import tag_routes
-from mediagoblin.webfinger.routing import webfinger_well_known_routes, \
- webfinger_routes
-from mediagoblin.admin.routing import admin_routes
+url_map = Map()
+
+view_functions = {}
+def add_route(endpoint, url, controller):
+ """
+ Add a route to the url mapping
+ """
+ # XXX: We cannot use this, since running tests means that the plugin
+ # routes will be populated over and over over the same session.
+ #
+ # assert endpoint not in view_functions.keys(), 'Trying to overwrite a rule'
-def get_mapper(plugin_routes):
- mapping = Mapper()
- mapping.minimization = False
+ view_functions.update({endpoint: controller})
- # Plugin routes go first so they can override default routes.
- mapping.extend(plugin_routes)
+ url_map.add(Rule(url, endpoint=endpoint))
- mapping.connect(
- "index", "/",
- controller="mediagoblin.views:root_view")
+def mount(mountpoint, routes):
+ """
+ Mount a bunch of routes to this mountpoint
+ """
+ for endpoint, url, controller in routes:
+ url = "%s/%s" % (mountpoint.rstrip('/'), url.lstrip('/'))
+ add_route(endpoint, url, controller)
- mapping.extend(auth_routes, '/auth')
- mapping.extend(submit_routes, '/submit')
- mapping.extend(user_routes, '/u')
- mapping.extend(edit_routes, '/edit')
- mapping.extend(tag_routes, '/tag')
- mapping.extend(webfinger_well_known_routes, '/.well-known')
- mapping.extend(webfinger_routes, '/api/webfinger')
- mapping.extend(admin_routes, '/a')
+add_route('index', '/', 'mediagoblin.views:root_view')
- return mapping
+from mediagoblin.admin.routing import admin_routes
+from mediagoblin.auth.routing import auth_routes
+mount('/auth', auth_routes)
+mount('/a', admin_routes)
+
+import mediagoblin.submit.routing
+import mediagoblin.user_pages.routing
+import mediagoblin.edit.routing
+import mediagoblin.webfinger.routing
+import mediagoblin.listings.routing
diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css
index 6bc85674..4120f965 100644
--- a/mediagoblin/static/css/base.css
+++ b/mediagoblin/static/css/base.css
@@ -138,37 +138,6 @@ header {
list-style: none;
}
-.dropdown {
- display: inline-block;
- color: #c3c3c3;
- background-color: #424242;
- border: 1px solid;
- border-color: #464646 #2B2B2B #252525;
- border-radius: 4px;
- padding: 3px 8px;
- font-size: 16px;
- text-decoration: none;
- font-style: normal;
- font-weight: bold;
- cursor: pointer;
- position: relative;
-}
-
-.dropdown_items {
- position: absolute;
- right: 0px;
- top: 25px;
- background-color: #424242;
- padding: 10px;
- width: 160px;
- border-radius: 5px 0 5px 5px;
- box-shadow: 0 2px 1px black;
-}
-
-.dropdown_items a {
- display: block;
-}
-
a.logo {
color: #fff;
font-weight: bold;
@@ -425,12 +394,21 @@ textarea#comment_content {
.media_thumbnail a {
color: #eee;
text-decoration: none;
+ display: block;
+}
+
+a.thumb_entry_title {
+ padding: 8px;
}
.media_thumbnail img {
max-height: 135px;
}
+.thumb_entry_last {
+ margin-right: 0px;
+}
+
/* collection media */
.collection_thumbnail {
@@ -486,7 +464,7 @@ p.media_specs {
padding: 130px 10px 20px 10px;
}
-img.media_image {
+a img.media_image {
cursor: -webkit-zoom-in;
cursor: -moz-zoom-in;
cursor: zoom-in;
diff --git a/mediagoblin/static/js/header_dropdown.js b/mediagoblin/static/js/header_dropdown.js
deleted file mode 100644
index 643bafa4..00000000
--- a/mediagoblin/static/js/header_dropdown.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * GNU MediaGoblin -- federated, autonomous media hosting
- * Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-$(document).ready(function() {
- $(".dropdown_items").hide();
- $(document).mouseup(function(e) {
- if($(e.target).is(".dropdown")) {
- $(".dropdown_items").toggle();
- } else if($(e.target).is(".dropdown_items")) {
- return;
- } else {
- $(".dropdown_items").hide();
- }
- });
-});
diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py
index ced3beb3..1b5a6363 100644
--- a/mediagoblin/storage/cloudfiles.py
+++ b/mediagoblin/storage/cloudfiles.py
@@ -104,10 +104,13 @@ class CloudFilesStorage(StorageInterface):
mimetype = mimetypes.guess_type(
filepath[-1])
- if mimetype:
+ if mimetype[0]:
# Set the mimetype on the CloudFiles object
obj.content_type = mimetype[0]
obj.metadata = {'mime-type': mimetype[0]}
+ else:
+ obj.content_type = 'application/octet-stream'
+ obj.metadata = {'mime-type': 'application/octet-stream'}
return CloudFilesStorageObjectWrapper(obj, *args, **kwargs)
diff --git a/mediagoblin/submit/routing.py b/mediagoblin/submit/routing.py
index 1e399d1e..fbe3c39c 100644
--- a/mediagoblin/submit/routing.py
+++ b/mediagoblin/submit/routing.py
@@ -14,11 +14,8 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes.route import Route
+from mediagoblin.routing import add_route
-submit_routes = [
- Route('mediagoblin.submit.start', '/',
- controller='mediagoblin.submit.views:submit_start'),
- Route('mediagoblin.submit.collection', '/collection',
- controller='mediagoblin.submit.views:add_collection'),
- ]
+add_route('mediagoblin.submit.start',
+ '/submit/', 'mediagoblin.submit.views:submit_start')
+add_route('mediagoblin.submit.collection', '/submit/collection', 'mediagoblin.submit.views:add_collection')
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index a9b13778..02026f45 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -18,7 +18,6 @@ from mediagoblin import messages
import mediagoblin.mg_globals as mg_globals
import uuid
from os.path import splitext
-from cgi import FieldStorage
from celery import registry
import urllib
@@ -28,6 +27,7 @@ import logging
_log = logging.getLogger(__name__)
from werkzeug.utils import secure_filename
+from werkzeug.datastructures import FileStorage
from mediagoblin.db.util import ObjectId
from mediagoblin.tools.text import convert_to_tag_list_of_dicts
@@ -47,40 +47,40 @@ def submit_start(request):
"""
First view for submitting a file.
"""
- submit_form = submit_forms.SubmitStartForm(request.POST)
+ submit_form = submit_forms.SubmitStartForm(request.form)
if request.method == 'POST' and submit_form.validate():
- if not ('file' in request.POST
- and isinstance(request.POST['file'], FieldStorage)
- and request.POST['file'].file):
+ if not ('file' in request.files
+ and isinstance(request.files['file'], FileStorage)
+ and request.files['file'].stream):
submit_form.file.errors.append(
_(u'You must provide a file.'))
else:
try:
- filename = request.POST['file'].filename
+ filename = request.files['file'].filename
# Sniff the submitted media to determine which
# media plugin should handle processing
media_type, media_manager = sniff_media(
- request.POST['file'])
+ request.files['file'])
# create entry and save in database
entry = request.db.MediaEntry()
entry.id = ObjectId()
entry.media_type = unicode(media_type)
entry.title = (
- unicode(request.POST['title'])
+ unicode(request.form['title'])
or unicode(splitext(filename)[0]))
- entry.description = unicode(request.POST.get('description'))
+ entry.description = unicode(request.form.get('description'))
- entry.license = unicode(request.POST.get('license', "")) or None
+ entry.license = unicode(request.form.get('license', "")) or None
entry.uploader = request.user._id
# Process the user's folksonomy "tags"
entry.tags = convert_to_tag_list_of_dicts(
- request.POST.get('tags'))
+ request.form.get('tags'))
# Generate a slug from the title
entry.generate_slug()
@@ -104,7 +104,7 @@ def submit_start(request):
queue_filepath, 'wb')
with queue_file:
- queue_file.write(request.POST['file'].file.read())
+ queue_file.write(request.files['file'].stream.read())
# Add queued filename to the entry
entry.queued_media_file = queue_filepath
@@ -188,16 +188,16 @@ def add_collection(request, media=None):
"""
View to create a new collection
"""
- submit_form = submit_forms.AddCollectionForm(request.POST)
+ submit_form = submit_forms.AddCollectionForm(request.form)
if request.method == 'POST' and submit_form.validate():
try:
collection = request.db.Collection()
collection.id = ObjectId()
- collection.title = unicode(request.POST['title'])
+ collection.title = unicode(request.form['title'])
- collection.description = unicode(request.POST.get('description'))
+ collection.description = unicode(request.form.get('description'))
collection.creator = request.user._id
collection.generate_slug()
@@ -205,13 +205,13 @@ def add_collection(request, media=None):
existing_collection = request.db.Collection.find_one({
'creator': request.user._id,
'title':collection.title})
-
+
if existing_collection:
messages.add_message(
request, messages.ERROR, _('You already have a collection called "%s"!' % collection.title))
else:
collection.save(validate=True)
-
+
add_message(request, SUCCESS, _('Collection "%s" added!' % collection.title))
return redirect(request, "mediagoblin.user_pages.user_home",
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index b6ba8818..e1fa0191 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -47,29 +47,23 @@
<a class="logo"
href="{{ request.urlgen('index') }}"
><img src="{{ request.staticdirect('/images/logo.png') }}"
- alt="{% trans %}MediaGoblin logo{% endtrans %}" /></a>
+ alt="{% trans %}MediaGoblin logo{% endtrans %}" />
+ </a>
{% endblock mediagoblin_logo %}
{% block mediagoblin_header_title %}{% endblock %}
<div class="header_right">
{% if request.user %}
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', user= request.user.username) }}">{{ request.user.username }}</a>{% trans %}'s account{% endtrans %}
+ (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>)
+ {% if request.user and request.user.status == 'active' %}
+ <a class="button_action" href="{{ request.urlgen('mediagoblin.submit.start') }}">{% trans %}Add media{% endtrans %}</a>
+ {% elif request.user and request.user.status == "needs_email_verification" %}
{# the following link should only appear when verification is needed #}
- {% if request.user.status == "needs_email_verification" %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user=request.user.username) }}"
+ user=request.user.username) }}"
class="button_action_highlight">
- {% trans %}Verify your email!{% endtrans %}</a>
+ {% trans %}Verify your email!{% endtrans %}</a>
{% endif %}
- <div class="dropdown">
- {{ request.user.username }} ▾
- <div class="dropdown_items">
- {% if request.user and request.user.status == 'active' %}
- <a href="{{ request.urlgen('mediagoblin.submit.start') }}">{% trans %}+ Add media{% endtrans %}</a>
- <a href="{{ request.urlgen('mediagoblin.submit.collection') }}">{% trans %}+ Add collection{% endtrans %}</a>
- {% endif %}
- <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', user= request.user.username) }}">{% trans %}View your profile{% endtrans %}</a>
- <a class="button_action" href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}Log out{% endtrans %}</a>
- </div>
- </div>
{% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}">
{% trans %}Log in{% endtrans %}</a>
diff --git a/mediagoblin/templates/mediagoblin/media_displays/image.html b/mediagoblin/templates/mediagoblin/media_displays/image.html
index 86725cca..30c2a90d 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/image.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/image.html
@@ -19,15 +19,4 @@
{% extends 'mediagoblin/user_pages/media.html' %}
{% block mediagoblin_sidebar %}
- {% if 'original' in media.media_files %}
- <h3>{% trans %}Download{% endtrans %}</h3>
- <p>
- <a href="{{ request.app.public_store.file_url(
- media.media_files['original']) }}">
- {%- trans -%}
- Original
- {%- endtrans -%}
- </a>
- </p>
- {% endif %}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index 5c6eb52f..99d3269f 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -21,6 +21,15 @@
{% block mediagoblin_content %}
{% if request.user %}
+ {% if request.user.status == 'active' %}
+ <h1>{% trans %}Actions{% endtrans %}</h1>
+ <p><a href="{{ request.urlgen('mediagoblin.submit.collection') }}">
+ {% trans %}Create new collection{% endtrans %}
+ </a></p>
+ <p><a href="{{ request.urlgen('mediagoblin.edit.account') }}">
+ {%- trans %}Change account settings{% endtrans -%}
+ </a></p>
+ {% endif %}
<h1>{% trans %}Explore{% endtrans %}</h1>
{% else %}
<h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
index c74535d7..eb3bde48 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/user.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/user.html
@@ -40,7 +40,7 @@
{% block mediagoblin_content -%}
{# If no user... #}
{% if not user %}
- <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/>
+ <p>{% trans %}Sorry, no such user found.{% endtrans %}</p>
{# User exists, but needs verification #}
{% elif user.status == "needs_email_verification" %}
@@ -119,18 +119,12 @@
</a>
{% endif %}
{% endif %}
-
- {% if request.user and (request.user._id == user._id) %}
- <a href="{{ request.urlgen('mediagoblin.edit.account') }}">
- {%- trans %}Change account settings{% endtrans -%}
- </a>
- {% endif %}
</div>
{% if media_entries.count() %}
<div class="profile_showcase">
{{ object_gallery(request, media_entries, pagination,
- pagination_base_url=user_gallery_url, col_number=3) }}
+ pagination_base_url=user_gallery_url, col_number=2) }}
{% include "mediagoblin/utils/object_gallery.html" %}
<div class="clear"></div>
<p>
diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
index 81506a84..bfd19ee6 100644
--- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html
+++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
@@ -34,8 +34,7 @@
entry.media_files['thumb']) }}" />
</a>
{% if entry.title %}
- <br />
- <a href="{{ entry_url }}">{{ entry.title }}</a>
+ <a class="thumb_entry_title" href="{{ entry_url }}">{{ entry.title }}</a>
{% endif %}
</td>
{% endfor %}
diff --git a/mediagoblin/templates/mediagoblin/utils/profile.html b/mediagoblin/templates/mediagoblin/utils/profile.html
index 945bd0bb..7a3af01c 100644
--- a/mediagoblin/templates/mediagoblin/utils/profile.html
+++ b/mediagoblin/templates/mediagoblin/utils/profile.html
@@ -19,7 +19,7 @@
{% block profile_content -%}
{% if user.bio %}
{% autoescape False %}
- <p>{{ user.bio_html }}</p>
+ {{ user.bio_html }}
{% endautoescape %}
{% endif %}
{% if user.url %}
diff --git a/mediagoblin/tests/test_http_callback.py b/mediagoblin/tests/test_http_callback.py
new file mode 100644
index 00000000..d769af1e
--- /dev/null
+++ b/mediagoblin/tests/test_http_callback.py
@@ -0,0 +1,81 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import json
+
+from urlparse import urlparse, parse_qs
+
+from mediagoblin import mg_globals
+from mediagoblin.tools import processing
+from mediagoblin.tests.tools import get_test_app, fixture_add_user
+from mediagoblin.tests.test_submission import GOOD_PNG
+from mediagoblin.tests import test_oauth as oauth
+
+
+class TestHTTPCallback(object):
+ def setUp(self):
+ self.app = get_test_app()
+ self.db = mg_globals.database
+
+ self.user_password = 'secret'
+ self.user = fixture_add_user('call_back', self.user_password)
+
+ self.login()
+
+ def login(self):
+ self.app.post('/auth/login/', {
+ 'username': self.user.username,
+ 'password': self.user_password})
+
+ def get_access_token(self, client_id, client_secret, code):
+ response = self.app.get('/oauth/access_token', {
+ 'code': code,
+ 'client_id': client_id,
+ 'client_secret': client_secret})
+
+ response_data = json.loads(response.body)
+
+ return response_data['access_token']
+
+ def test_callback(self):
+ ''' Test processing HTTP callback '''
+
+ self.oauth = oauth.TestOAuth()
+ self.oauth.setUp()
+
+ redirect, client_id = self.oauth.test_4_authorize_confidential_client()
+
+ code = parse_qs(urlparse(redirect.location).query)['code'][0]
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.identifier == unicode(client_id)).first()
+
+ client_secret = client.secret
+
+ access_token = self.get_access_token(client_id, client_secret, code)
+
+ callback_url = 'https://foo.example?secrettestmediagoblinparam'
+
+ res = self.app.post('/api/submit?client_id={0}&access_token={1}\
+&client_secret={2}'.format(
+ client_id,
+ access_token,
+ client_secret), {
+ 'title': 'Test',
+ 'callback_url': callback_url},
+ upload_files=[('file', GOOD_PNG)])
+
+ assert processing.TESTS_CALLBACKS[callback_url]['state'] == u'processed'
diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini
index 3b979ff7..cde61a70 100644
--- a/mediagoblin/tests/test_mgoblin_app.ini
+++ b/mediagoblin/tests/test_mgoblin_app.ini
@@ -31,3 +31,7 @@ lock_dir = %(here)s/test_user_dev/beaker/cache/lock
CELERY_ALWAYS_EAGER = true
CELERY_RESULT_DBURI = "sqlite:///%(here)s/test_user_dev/celery.db"
BROKER_HOST = "sqlite:///%(here)s/test_user_dev/kombu.db"
+
+[plugins]
+[[mediagoblin.plugins.api]]
+[[mediagoblin.plugins.oauth]]
diff --git a/mediagoblin/tests/test_oauth.py b/mediagoblin/tests/test_oauth.py
new file mode 100644
index 00000000..db4e226a
--- /dev/null
+++ b/mediagoblin/tests/test_oauth.py
@@ -0,0 +1,183 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import json
+import logging
+
+from urlparse import parse_qs, urlparse
+
+from mediagoblin import mg_globals
+from mediagoblin.tools import template, pluginapi
+from mediagoblin.tests.tools import get_test_app, fixture_add_user
+
+
+_log = logging.getLogger(__name__)
+
+
+class TestOAuth(object):
+ def setUp(self):
+ self.app = get_test_app()
+ self.db = mg_globals.database
+
+ self.pman = pluginapi.PluginManager()
+
+ self.user_password = '4cc355_70k3N'
+ self.user = fixture_add_user('joauth', self.user_password)
+
+ self.login()
+
+ def login(self):
+ self.app.post(
+ '/auth/login/', {
+ 'username': self.user.username,
+ 'password': self.user_password})
+
+ def register_client(self, name, client_type, description=None,
+ redirect_uri=''):
+ return self.app.post(
+ '/oauth/client/register', {
+ 'name': name,
+ 'description': description,
+ 'type': client_type,
+ 'redirect_uri': redirect_uri})
+
+ def get_context(self, template_name):
+ return template.TEMPLATE_TEST_CONTEXT[template_name]
+
+ def test_1_public_client_registration_without_redirect_uri(self):
+ ''' Test 'public' OAuth client registration without any redirect uri '''
+ response = self.register_client('OMGOMGOMG', 'public',
+ 'OMGOMG Apache License v2')
+
+ ctx = self.get_context('oauth/client/register.html')
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.name == 'OMGOMGOMG').first()
+
+ assert response.status_int == 200
+
+ # Should display an error
+ assert ctx['form'].redirect_uri.errors
+
+ # Should not pass through
+ assert not client
+
+ def test_2_successful_public_client_registration(self):
+ ''' Successfully register a public client '''
+ self.login()
+ self.register_client('OMGOMG', 'public', 'OMG!',
+ 'http://foo.example')
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.name == 'OMGOMG').first()
+
+ # Client should have been registered
+ assert client
+
+ def test_3_successful_confidential_client_reg(self):
+ ''' Register a confidential OAuth client '''
+ response = self.register_client('GMOGMO', 'confidential', 'NO GMO!')
+
+ assert response.status_int == 302
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.name == 'GMOGMO').first()
+
+ # Client should have been registered
+ assert client
+
+ return client
+
+ def test_4_authorize_confidential_client(self):
+ ''' Authorize a confidential client as a logged in user '''
+ client = self.test_3_successful_confidential_client_reg()
+
+ client_identifier = client.identifier
+
+ redirect_uri = 'https://foo.example'
+ response = self.app.get('/oauth/authorize', {
+ 'client_id': client.identifier,
+ 'scope': 'admin',
+ 'redirect_uri': redirect_uri})
+
+ # User-agent should NOT be redirected
+ assert response.status_int == 200
+
+ ctx = self.get_context('oauth/authorize.html')
+
+ form = ctx['form']
+
+ # Short for client authorization post reponse
+ capr = self.app.post(
+ '/oauth/client/authorize', {
+ 'client_id': form.client_id.data,
+ 'allow': 'Allow',
+ 'next': form.next.data})
+
+ assert capr.status_int == 302
+
+ authorization_response = capr.follow()
+
+ assert authorization_response.location.startswith(redirect_uri)
+
+ return authorization_response, client_identifier
+
+ def get_code_from_redirect_uri(self, uri):
+ return parse_qs(urlparse(uri).query)['code'][0]
+
+ def test_token_endpoint_successful_confidential_request(self):
+ ''' Successful request against token endpoint '''
+ code_redirect, client_id = self.test_4_authorize_confidential_client()
+
+ code = self.get_code_from_redirect_uri(code_redirect.location)
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.identifier == unicode(client_id)).first()
+
+ token_res = self.app.get('/oauth/access_token?client_id={0}&\
+code={1}&client_secret={2}'.format(client_id, code, client.secret))
+
+ assert token_res.status_int == 200
+
+ token_data = json.loads(token_res.body)
+
+ assert not 'error' in token_data
+ assert 'access_token' in token_data
+ assert 'token_type' in token_data
+ assert 'expires_in' in token_data
+ assert type(token_data['expires_in']) == int
+ assert token_data['expires_in'] > 0
+
+ def test_token_endpont_missing_id_confidential_request(self):
+ ''' Unsuccessful request against token endpoint, missing client_id '''
+ code_redirect, client_id = self.test_4_authorize_confidential_client()
+
+ code = self.get_code_from_redirect_uri(code_redirect.location)
+
+ client = self.db.OAuthClient.query.filter(
+ self.db.OAuthClient.identifier == unicode(client_id)).first()
+
+ token_res = self.app.get('/oauth/access_token?\
+code={0}&client_secret={1}'.format(code, client.secret))
+
+ assert token_res.status_int == 200
+
+ token_data = json.loads(token_res.body)
+
+ assert 'error' in token_data
+ assert not 'access_token' in token_data
+ assert token_data['error'] == 'invalid_request'
+ assert token_data['error_description'] == 'Missing client_id in request'
diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py
index 6fd11fc2..d3369831 100644
--- a/mediagoblin/tests/tools.py
+++ b/mediagoblin/tests/tools.py
@@ -60,7 +60,7 @@ class BadCeleryEnviron(Exception): pass
class TestingMeddleware(BaseMeddleware):
"""
Meddleware for the Unit tests
-
+
It might make sense to perform some tests on all
requests/responses. Or prepare them in a special
manner. For example all html responses could be tested
@@ -100,7 +100,7 @@ def suicide_if_bad_celery_environ():
if not os.environ.get('CELERY_CONFIG_MODULE') == \
'mediagoblin.init.celery.from_tests':
raise BadCeleryEnviron(BAD_CELERY_MESSAGE)
-
+
def get_test_app(dump_old_app=True):
suicide_if_bad_celery_environ()
@@ -202,8 +202,8 @@ def assert_db_meets_expected(db, expected):
assert document == expected_document # make sure it matches
-def fixture_add_user(username = u'chris', password = 'toast',
- active_user = True):
+def fixture_add_user(username=u'chris', password='toast',
+ active_user=True):
test_user = mg_globals.database.User()
test_user.username = username
test_user.email = username + u'@example.com'
diff --git a/mediagoblin/themes/airy/assets/css/airy.css b/mediagoblin/themes/airy/assets/css/airy.css
index 22f12d5e..c63345b2 100644
--- a/mediagoblin/themes/airy/assets/css/airy.css
+++ b/mediagoblin/themes/airy/assets/css/airy.css
@@ -3,22 +3,19 @@ body {
background-color: #F7F7F7;
}
-h1,h2 {
- color: #787878;
-}
-
-h3 {
+h1,h2,h3 {
color: #4a4a4a;
}
a {
- color: #37BD85;
+ color: #37AB74;
}
.navigation_button {
background-color: #fff;
border: 1px solid;
- border-color: #F3F3F3 #ECECEC #C7C7C7;
+ border-color: #e4e4e4;
+ border-width: 1px 1px 2px;
color: #4a4a4a;
font-weight: bold;
}
@@ -44,14 +41,16 @@ footer {
color: #4a4a4a;
background-color: #fff;
border: 1px solid;
- border-color: #F3F3F3 #ECECEC #C7C7C7;
+ border-color: #E4E4E4;
+ border-width: 1px 1px 2px;
padding: 5px 10px;
}
.button_action_highlight, .button_form {
color: #fff;
- background-color: #37BD85;
- border-color: #A2DEC3 #6CAA8E #5C9179;
+ background-color: #37AB74;
+ border-color: #6CAA8E;
+ border-width: 1px 1px 2px;
}
input, textarea {
@@ -66,20 +65,12 @@ input, textarea {
.media_thumbnail {
background-color: #fff;
- border: 1px solid #e4e4e4;
- margin: 0 3px 10px;
}
.media_thumbnail a {
color: #4a4a4a;
}
-.dropdown {
- color: #4a4a4a;
- border: 1px solid #e4e4e4;
- background-color: #fff;
-}
-
-.dropdown_items {
- background-color: #fff;
+.empty_space {
+ background-image: url("../images/empty_dots.png");
}
diff --git a/mediagoblin/themes/airy/assets/images/empty_dots.png b/mediagoblin/themes/airy/assets/images/empty_dots.png
new file mode 100644
index 00000000..5ee050b2
--- /dev/null
+++ b/mediagoblin/themes/airy/assets/images/empty_dots.png
Binary files differ
diff --git a/mediagoblin/themes/airy/assets/images/icon_feed.png b/mediagoblin/themes/airy/assets/images/icon_feed.png
new file mode 100644
index 00000000..18c085b4
--- /dev/null
+++ b/mediagoblin/themes/airy/assets/images/icon_feed.png
Binary files differ
diff --git a/mediagoblin/themes/airy/templates/mediagoblin/base.html b/mediagoblin/themes/airy/templates/mediagoblin/base.html
index 8bd9a7f9..db500199 100644
--- a/mediagoblin/themes/airy/templates/mediagoblin/base.html
+++ b/mediagoblin/themes/airy/templates/mediagoblin/base.html
@@ -53,23 +53,17 @@
{% block mediagoblin_header_title %}{% endblock %}
<div class="header_right">
{% if request.user %}
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', user= request.user.username) }}">{{ request.user.username }}</a>{% trans %}'s account{% endtrans %}
+ (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>)
+ {% if request.user and request.user.status == 'active' %}
+ <a class="button_action" href="{{ request.urlgen('mediagoblin.submit.start') }}">{% trans %}Add media{% endtrans %}</a>
+ {% elif request.user and request.user.status == "needs_email_verification" %}
{# the following link should only appear when verification is needed #}
- {% if request.user.status == "needs_email_verification" %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user=request.user.username) }}"
+ user=request.user.username) }}"
class="button_action_highlight">
- {% trans %}Verify your email!{% endtrans %}</a>
+ {% trans %}Verify your email!{% endtrans %}</a>
{% endif %}
- <div class="dropdown">
- {{ request.user.username }} ▾
- <div class="dropdown_items">
- {% if request.user and request.user.status == 'active' %}
- <a href="{{ request.urlgen('mediagoblin.submit.start') }}">{% trans %}+ Add media{% endtrans %}</a>
- {% endif %}
- <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', user= request.user.username) }}">{% trans %}View your profile{% endtrans %}</a>
- <a class="button_action" href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}Log out{% endtrans %}</a>
- </div>
- </div>
{% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}">
{% trans %}Log in{% endtrans %}</a>
diff --git a/mediagoblin/themes/airy/templates/mediagoblin/extra_head.html b/mediagoblin/themes/airy/templates/mediagoblin/extra_head.html
index e53a1a01..03e7db90 100644
--- a/mediagoblin/themes/airy/templates/mediagoblin/extra_head.html
+++ b/mediagoblin/themes/airy/templates/mediagoblin/extra_head.html
@@ -1,6 +1,6 @@
{#
-# GoblinCities theme for MediaGoblin
-# Copyright (C) 2012 Christopher Allan Webber
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
diff --git a/mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html b/mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html
new file mode 100644
index 00000000..cf5099a2
--- /dev/null
+++ b/mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html
@@ -0,0 +1,23 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+<a href="{{ feed_url }}">
+ <img src="{{ request.staticdirect('/images/icon_feed.png', 'theme') }}"
+ class="media_icon" alt="{% trans %}feed icon{% endtrans %}" />
+</a>
+<a href="{{ feed_url }}">{%- trans %}Atom feed{% endtrans -%}</a>
diff --git a/mediagoblin/tools/extlib/wtf_html5.py b/mediagoblin/tools/extlib/wtf_html5.py
new file mode 120000
index 00000000..5028c599
--- /dev/null
+++ b/mediagoblin/tools/extlib/wtf_html5.py
@@ -0,0 +1 @@
+../../../extlib/flask-wtf/html5.py \ No newline at end of file
diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py
index ff7d4cad..50e59070 100644
--- a/mediagoblin/tools/pagination.py
+++ b/mediagoblin/tools/pagination.py
@@ -59,7 +59,6 @@ class Pagination(object):
self.active_id = jump_to_id
break
-
def __call__(self):
"""
Returns slice of objects for the requested page
@@ -96,7 +95,7 @@ class Pagination(object):
"""
Get a page url by adding a page= parameter to the base url
"""
- new_get_params = copy.copy(get_params or {})
+ new_get_params = dict(get_params) or {}
new_get_params['page'] = page_no
return "%s?%s" % (
base_url, urllib.urlencode(new_get_params))
diff --git a/mediagoblin/tools/pluginapi.py b/mediagoblin/tools/pluginapi.py
index 7c1e108b..1752dfc8 100644
--- a/mediagoblin/tools/pluginapi.py
+++ b/mediagoblin/tools/pluginapi.py
@@ -125,6 +125,7 @@ class PluginManager(object):
def register_route(self, route):
"""Registers a single route"""
+ _log.debug('registering route: {0}'.format(route))
self.routes.append(route)
def get_routes(self):
@@ -162,7 +163,7 @@ def register_routes(routes):
Be careful when designing your route urls. If they clash with
core urls, then it could result in DISASTER!
"""
- if isinstance(routes, (tuple, list)):
+ if isinstance(routes, list):
for route in routes:
PluginManager().register_route(route)
else:
diff --git a/mediagoblin/tools/processing.py b/mediagoblin/tools/processing.py
new file mode 100644
index 00000000..cff4cb9d
--- /dev/null
+++ b/mediagoblin/tools/processing.py
@@ -0,0 +1,89 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import json
+import traceback
+
+from urllib2 import urlopen, Request, HTTPError
+from urllib import urlencode
+
+from mediagoblin.tools.common import TESTS_ENABLED
+
+_log = logging.getLogger(__name__)
+
+TESTS_CALLBACKS = {}
+
+
+def create_post_request(url, data, **kw):
+ '''
+ Issue a HTTP POST request.
+
+ Args:
+ url: The URL to which the POST request should be issued
+ data: The data to be send in the body of the request
+ **kw:
+ data_parser: The parser function that is used to parse the `data`
+ argument
+ '''
+ data_parser = kw.get('data_parser', urlencode)
+ headers = kw.get('headers', {})
+
+ return Request(url, data_parser(data), headers=headers)
+
+
+def json_processing_callback(entry):
+ '''
+ Send an HTTP post to the registered callback url, if any.
+ '''
+ if not entry.processing_metadata:
+ _log.debug('No processing callback for {0}'.format(entry))
+ return
+
+ url = entry.processing_metadata[0].callback_url
+
+ _log.debug('Sending processing callback for {0} ({1})'.format(
+ entry,
+ url))
+
+ headers = {
+ 'Content-Type': 'application/json'}
+
+ data = {
+ 'id': entry.id,
+ 'state': entry.state}
+
+ # Trigger testing mode, no callback will be sent
+ if url.endswith('secrettestmediagoblinparam'):
+ TESTS_CALLBACKS.update({url: data})
+ return True
+
+ request = create_post_request(
+ url,
+ data,
+ headers=headers,
+ data_parser=json.dumps)
+
+ try:
+ urlopen(request)
+ _log.debug('Processing callback for {0} sent'.format(entry))
+
+ return True
+ except HTTPError:
+ _log.error('Failed to send callback: {0}'.format(
+ traceback.format_exc()))
+
+ return False
diff --git a/mediagoblin/tools/translate.py b/mediagoblin/tools/translate.py
index 5ab62a07..01cabe6a 100644
--- a/mediagoblin/tools/translate.py
+++ b/mediagoblin/tools/translate.py
@@ -60,31 +60,17 @@ def get_locale_from_request(request):
Figure out what target language is most appropriate based on the
request
"""
- request_form = request.GET or request.POST
+ request_form = request.GET or request.form
if request_form.has_key('lang'):
return locale_to_lower_upper(request_form['lang'])
- # Your routing can explicitly specify a target language
- matchdict = request.matchdict or {}
-
- if matchdict.has_key('locale'):
- target_lang = matchdict['locale']
- elif request.session.has_key('target_lang'):
+ if 'target_lang' in request.session:
target_lang = request.session['target_lang']
# Pull the first acceptable language or English
else:
- # WebOb recently changed how it handles determining best language.
- # Here's a compromise commit that handles either/or...
- if hasattr(request.accept_language, "best_matches"):
- accept_lang_matches = request.accept_language.best_matches()
- if accept_lang_matches:
- target_lang = accept_lang_matches[0]
- else:
- target_lang = 'en'
- else:
- target_lang = request.accept.best_match(
- request.accept_language, 'en')
+ # TODO: Internationalization broken
+ target_lang = 'en'
return locale_to_lower_upper(target_lang)
diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py
index 1cfce2dd..8162e641 100644
--- a/mediagoblin/user_pages/routing.py
+++ b/mediagoblin/user_pages/routing.py
@@ -14,48 +14,68 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes.route import Route
-
-user_routes = [
- Route('mediagoblin.user_pages.user_home', "/{user}/",
- controller="mediagoblin.user_pages.views:user_home"),
- Route('mediagoblin.user_pages.user_gallery', "/{user}/gallery/",
- controller="mediagoblin.user_pages.views:user_gallery"),
- Route('mediagoblin.user_pages.media_home', '/{user}/m/{media}/',
- requirements=dict(m_id="[0-9a-fA-F]{24}"),
- controller="mediagoblin.user_pages.views:media_home"),
- Route('mediagoblin.user_pages.media_home.view_comment',
- '/{user}/m/{media}/c/{comment}/',
- controller="mediagoblin.user_pages.views:media_home"),
- Route('mediagoblin.edit.edit_media', "/{user}/m/{media}/edit/",
- controller="mediagoblin.edit.views:edit_media"),
- Route('mediagoblin.edit.attachments',
- '/{user}/m/{media}/attachments/',
- controller="mediagoblin.edit.views:edit_attachments"),
- Route('mediagoblin.user_pages.media_confirm_delete',
- "/{user}/m/{media}/confirm-delete/",
- controller="mediagoblin.user_pages.views:media_confirm_delete"),
- Route('mediagoblin.user_pages.atom_feed', '/{user}/atom/',
- controller="mediagoblin.user_pages.views:atom_feed"),
- Route('mediagoblin.user_pages.media_post_comment',
- '/{user}/m/{media}/comment/add/',
- controller="mediagoblin.user_pages.views:media_post_comment"),
- Route('mediagoblin.user_pages.media_collect',
- "/{user}/m/{media}/collect/",
- controller="mediagoblin.user_pages.views:media_collect"),
- Route('mediagoblin.user_pages.user_collection', "/{user}/collection/{collection}/",
- controller="mediagoblin.user_pages.views:user_collection"),
- Route('mediagoblin.edit.edit_collection', "/{user}/c/{collection}/edit/",
- controller="mediagoblin.edit.views:edit_collection"),
- Route('mediagoblin.user_pages.collection_confirm_delete',
- "/{user}/c/{collection}/confirm-delete/",
- controller="mediagoblin.user_pages.views:collection_confirm_delete"),
- Route('mediagoblin.user_pages.collection_item_confirm_remove',
- "/{user}/collection/{collection}/{collection_item}/confirm_remove/",
- controller="mediagoblin.user_pages.views:collection_item_confirm_remove"),
- Route('mediagoblin.user_pages.collection_atom_feed', '/{user}/collection/{collection}/atom/',
- controller="mediagoblin.user_pages.views:collection_atom_feed"),
- Route('mediagoblin.user_pages.processing_panel',
- '/{user}/panel/',
- controller="mediagoblin.user_pages.views:processing_panel"),
- ]
+from mediagoblin.routing import add_route
+
+add_route('mediagoblin.user_pages.user_home',
+ '/u/<string:user>/', 'mediagoblin.user_pages.views:user_home')
+
+add_route('mediagoblin.user_pages.media_home',
+ '/u/<string:user>/m/<string:media>/',
+ 'mediagoblin.user_pages.views:media_home')
+
+add_route('mediagoblin.user_pages.media_confirm_delete',
+ '/u/<string:user>/m/<string:media>/confirm-delete/',
+ 'mediagoblin.user_pages.views:media_confirm_delete')
+
+add_route('mediagoblin.user_pages.media_post_comment',
+ '/u/<string:user>/m/<string:media>/comment/add/',
+ 'mediagoblin.user_pages.views:media_post_comment')
+
+add_route('mediagoblin.user_pages.user_gallery',
+ '/u/<string:user>/gallery/',
+ 'mediagoblin.user_pages.views:user_gallery')
+
+add_route('mediagoblin.user_pages.media_home.view_comment',
+ '/u/<string:user>/m/<string:media>/c/<string:comment>/',
+ 'mediagoblin.user_pages.views:media_home')
+
+add_route('mediagoblin.user_pages.atom_feed',
+ '/u/<string:user>/atom/',
+ 'mediagoblin.user_pages.views:atom_feed')
+
+add_route('mediagoblin.user_pages.media_collect',
+ '/u/<string:user>/m/<string:media>/collect/',
+ 'mediagoblin.user_pages.views:media_collect')
+
+add_route('mediagoblin.user_pages.user_collection',
+ '/u/<string:user>/collection/<string:collection>/',
+ 'mediagoblin.user_pages.views:user_collection')
+
+add_route('mediagoblin.edit.edit_collection',
+ '/u/<string:user>/c/<string:collection>/edit/',
+ 'mediagoblin.edit.views:edit_collection')
+
+add_route('mediagoblin.user_pages.collection_confirm_delete',
+ '/u/<string:user>/c/<string:collection>/confirm-delete/',
+ 'mediagoblin.user_pages.views:collection_confirm_delete')
+
+add_route('mediagoblin.user_pages.collection_item_confirm_remove',
+ '/u/<string:user>/collection/<string:collection>/<string:collection_item>/confirm_remove/',
+ 'mediagoblin.user_pages.views:collection_item_confirm_remove')
+
+add_route('mediagoblin.user_pages.collection_atom_feed',
+ '/u/<string:user>/collection/<string:collection>/atom/',
+ 'mediagoblin.user_pages.views:collection_atom_feed')
+
+add_route('mediagoblin.user_pages.processing_panel',
+ '/u/<string:user>/panel/',
+ 'mediagoblin.user_pages.views:processing_panel')
+
+# Stray edit routes
+add_route('mediagoblin.edit.edit_media',
+ '/u/<string:user>/m/<string:media>/edit/',
+ 'mediagoblin.edit.views:edit_media')
+
+add_route('mediagoblin.edit.attachments',
+ '/u/<string:user>/m/<string:media>/attachments/',
+ 'mediagoblin.edit.views:edit_attachments')
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index e5131b02..c26bd340 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -126,7 +126,7 @@ def media_home(request, media, page, **kwargs):
comments = pagination()
- comment_form = user_forms.MediaCommentForm(request.POST)
+ comment_form = user_forms.MediaCommentForm(request.form)
media_template_name = get_media_manager(
media.media_type)['display_template']
@@ -152,7 +152,7 @@ def media_post_comment(request, media):
comment = request.db.MediaComment()
comment.media_entry = media.id
comment.author = request.user.id
- comment.content = unicode(request.POST['comment_content'])
+ comment.content = unicode(request.form['comment_content'])
if not comment.content.strip():
messages.add_message(
@@ -180,7 +180,7 @@ def media_post_comment(request, media):
@require_active_login
def media_collect(request, media):
- form = user_forms.MediaCollectForm(request.POST)
+ form = user_forms.MediaCollectForm(request.form)
filt = (request.db.Collection.creator == request.user.id)
form.collection.query = request.db.Collection.query.filter(
filt).order_by(request.db.Collection.title)
@@ -192,15 +192,15 @@ def media_collect(request, media):
collection_item = request.db.CollectionItem()
# If the user is adding a new collection, use that
- if request.POST['collection_title']:
+ if request.form['collection_title']:
collection = request.db.Collection()
collection.id = ObjectId()
collection.title = (
- unicode(request.POST['collection_title']))
+ unicode(request.form['collection_title']))
collection.description = unicode(
- request.POST.get('collection_description'))
+ request.form.get('collection_description'))
collection.creator = request.user._id
collection.generate_slug()
@@ -225,7 +225,7 @@ def media_collect(request, media):
# Otherwise, use the collection selected from the drop-down
else:
collection = request.db.Collection.find_one({
- '_id': request.POST.get('collection')})
+ '_id': request.form.get('collection')})
collection_item.collection = collection.id
# Make sure the user actually selected a collection
@@ -244,7 +244,7 @@ def media_collect(request, media):
else:
collection_item.media_entry = media.id
collection_item.author = request.user.id
- collection_item.note = unicode(request.POST['note'])
+ collection_item.note = unicode(request.form['note'])
collection_item.save(validate=True)
collection.items = collection.items + 1
@@ -277,7 +277,7 @@ def media_collect(request, media):
@user_may_delete_media
def media_confirm_delete(request, media):
- form = user_forms.ConfirmDeleteForm(request.POST)
+ form = user_forms.ConfirmDeleteForm(request.form)
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
@@ -360,7 +360,7 @@ def user_collection(request, page):
@user_may_alter_collection
def collection_item_confirm_remove(request, collection_item):
- form = user_forms.ConfirmCollectionItemRemoveForm(request.POST)
+ form = user_forms.ConfirmCollectionItemRemoveForm(request.form)
if request.method == 'POST' and form.validate():
username = collection_item.in_collection.get_creator.username
@@ -405,7 +405,7 @@ def collection_item_confirm_remove(request, collection_item):
@user_may_alter_collection
def collection_confirm_delete(request, collection):
- form = user_forms.ConfirmDeleteForm(request.POST)
+ form = user_forms.ConfirmDeleteForm(request.form)
if request.method == 'POST' and form.validate():
diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py
index 7e84a00a..18f9eb02 100644
--- a/mediagoblin/webfinger/routing.py
+++ b/mediagoblin/webfinger/routing.py
@@ -14,12 +14,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from routes.route import Route
+from mediagoblin.routing import add_route
-webfinger_well_known_routes = [
- Route('mediagoblin.webfinger.host_meta', '/host-meta',
- controller='mediagoblin.webfinger.views:host_meta')]
+add_route('mediagoblin.webfinger.host_meta', '/.well-known/host-meta',
+ 'mediagoblin.webfinger.views:host_meta')
-webfinger_routes = [
- Route('mediagoblin.webfinger.xrd', '/xrd',
- controller='mediagoblin.webfinger.views:xrd')]
+add_route('mediagoblin.webfinger.xrd', '/webfinger/xrd',
+ 'mediagoblin.webfinger.views:xrd')
diff --git a/setup.py b/setup.py
index 21c1179e..99584369 100644
--- a/setup.py
+++ b/setup.py
@@ -44,7 +44,6 @@ setup(
'setuptools',
'PasteScript',
'beaker',
- 'routes',
'webob<=1.2a2,>=1.1',
'wtforms',
'py-bcrypt',