From e72a03c24927baf5a8b3c666e06c2f55aeac19e3 Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Thu, 14 Nov 2013 09:58:41 +0200 Subject: [PATCH] configure smtp and setup django-registration module. configure this module to our User model because, it works only with standart user model create simple templates, for registration, login, password change and so on --- accounts/models.py | 4 +- accounts/urls.py | 5 +- accounts/views.py | 7 +- news/urls.py | 1 + news/views.py | 2 +- proj/admin_urls.py | 38 +++ proj/settings.py | 20 +- proj/urls.py | 17 +- proj/views.py | 3 + registration/__init__.py | 22 ++ registration/admin.py | 46 +++ registration/auth_urls.py | 60 ++++ registration/backends/__init__.py | 0 registration/backends/default/__init__.py | 0 registration/backends/default/urls.py | 50 ++++ registration/backends/default/views.py | 130 +++++++++ registration/backends/simple/__init__.py | 0 registration/backends/simple/urls.py | 36 +++ registration/backends/simple/views.py | 45 +++ registration/forms.py | 131 +++++++++ registration/locale/ar/LC_MESSAGES/django.mo | Bin 0 -> 2135 bytes registration/locale/ar/LC_MESSAGES/django.po | 81 ++++++ registration/locale/bg/LC_MESSAGES/django.mo | Bin 0 -> 2302 bytes registration/locale/bg/LC_MESSAGES/django.po | 78 +++++ registration/locale/ca/LC_MESSAGES/django.mo | Bin 0 -> 1953 bytes registration/locale/ca/LC_MESSAGES/django.po | 97 +++++++ registration/locale/cs/LC_MESSAGES/django.mo | Bin 0 -> 1963 bytes registration/locale/cs/LC_MESSAGES/django.po | 94 ++++++ registration/locale/da/LC_MESSAGES/django.mo | Bin 0 -> 1803 bytes registration/locale/da/LC_MESSAGES/django.po | 92 ++++++ registration/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 1999 bytes registration/locale/de/LC_MESSAGES/django.po | 93 ++++++ registration/locale/el/LC_MESSAGES/django.mo | Bin 0 -> 2424 bytes registration/locale/el/LC_MESSAGES/django.po | 84 ++++++ registration/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 367 bytes registration/locale/en/LC_MESSAGES/django.po | 89 ++++++ registration/locale/es/LC_MESSAGES/django.mo | Bin 0 -> 1909 bytes registration/locale/es/LC_MESSAGES/django.po | 85 ++++++ .../locale/es_AR/LC_MESSAGES/django.mo | Bin 0 -> 1849 bytes .../locale/es_AR/LC_MESSAGES/django.po | 83 ++++++ registration/locale/fa/LC_MESSAGES/django.mo | Bin 0 -> 2175 bytes registration/locale/fa/LC_MESSAGES/django.po | 80 ++++++ registration/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 2012 bytes registration/locale/fr/LC_MESSAGES/django.po | 91 ++++++ registration/locale/he/LC_MESSAGES/django.mo | Bin 0 -> 1896 bytes registration/locale/he/LC_MESSAGES/django.po | 86 ++++++ registration/locale/hr/LC_MESSAGES/django.mo | Bin 0 -> 1939 bytes registration/locale/hr/LC_MESSAGES/django.po | 86 ++++++ registration/locale/is/LC_MESSAGES/django.mo | Bin 0 -> 1476 bytes registration/locale/is/LC_MESSAGES/django.po | 74 +++++ registration/locale/it/LC_MESSAGES/django.mo | Bin 0 -> 2029 bytes registration/locale/it/LC_MESSAGES/django.po | 89 ++++++ registration/locale/ja/LC_MESSAGES/django.mo | Bin 0 -> 2035 bytes registration/locale/ja/LC_MESSAGES/django.po | 78 +++++ registration/locale/ko/LC_MESSAGES/django.mo | Bin 0 -> 1947 bytes registration/locale/ko/LC_MESSAGES/django.po | 89 ++++++ registration/locale/nb/LC_MESSAGES/django.mo | Bin 0 -> 1891 bytes registration/locale/nb/LC_MESSAGES/django.po | 91 ++++++ registration/locale/nl/LC_MESSAGES/django.mo | Bin 0 -> 1898 bytes registration/locale/nl/LC_MESSAGES/django.po | 77 +++++ registration/locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 1769 bytes registration/locale/pl/LC_MESSAGES/django.po | 84 ++++++ registration/locale/pt/LC_MESSAGES/django.mo | Bin 0 -> 1895 bytes registration/locale/pt/LC_MESSAGES/django.po | 88 ++++++ .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 1796 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 81 ++++++ registration/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 2470 bytes registration/locale/ru/LC_MESSAGES/django.po | 92 ++++++ registration/locale/sl/LC_MESSAGES/django.mo | Bin 0 -> 1889 bytes registration/locale/sl/LC_MESSAGES/django.po | 87 ++++++ registration/locale/sr/LC_MESSAGES/django.mo | Bin 0 -> 1966 bytes registration/locale/sr/LC_MESSAGES/django.po | 80 ++++++ registration/locale/sv/LC_MESSAGES/django.mo | Bin 0 -> 1687 bytes registration/locale/sv/LC_MESSAGES/django.po | 81 ++++++ .../locale/tr_TR/LC_MESSAGES/django.mo | Bin 0 -> 1945 bytes .../locale/tr_TR/LC_MESSAGES/django.po | 92 ++++++ .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 0 -> 1669 bytes .../locale/zh_CN/LC_MESSAGES/django.po | 77 +++++ .../locale/zh_TW/LC_MESSAGES/django.mo | Bin 0 -> 1669 bytes .../locale/zh_TW/LC_MESSAGES/django.po | 77 +++++ registration/management/__init__.py | 0 registration/management/commands/__init__.py | 0 .../commands/cleanupregistration.py | 19 ++ registration/models.py | 270 ++++++++++++++++++ registration/signals.py | 8 + registration/tests/__init__.py | 4 + registration/tests/default_backend.py | 198 +++++++++++++ registration/tests/forms.py | 119 ++++++++ registration/tests/models.py | 225 +++++++++++++++ registration/tests/simple_backend.py | 89 ++++++ registration/tests/urls.py | 82 ++++++ registration/urls.py | 15 + registration/views.py | 142 +++++++++ templates/base.html | 1 + templates/registration/activate.html | 16 ++ .../registration/activation_complete.html | 8 + templates/registration/activation_email.txt | 6 + .../registration/activation_email_subject.txt | 1 + templates/registration/base.html | 23 ++ templates/registration/login.html | 27 ++ templates/registration/login_error.html | 0 templates/registration/logout.html | 8 + .../registration/password_change_done.html | 16 ++ .../registration/password_change_form.html | 31 ++ .../registration/password_reset_complete.html | 21 ++ .../registration/password_reset_confirm.html | 33 +++ .../registration/password_reset_done.html | 14 + .../registration/password_reset_email.html | 15 + .../registration/password_reset_form.html | 20 ++ .../registration/registration_complete.html | 8 + templates/registration/registration_form.html | 65 +++++ 111 files changed, 4639 insertions(+), 18 deletions(-) create mode 100644 proj/admin_urls.py create mode 100644 registration/__init__.py create mode 100644 registration/admin.py create mode 100644 registration/auth_urls.py create mode 100644 registration/backends/__init__.py create mode 100644 registration/backends/default/__init__.py create mode 100644 registration/backends/default/urls.py create mode 100644 registration/backends/default/views.py create mode 100644 registration/backends/simple/__init__.py create mode 100644 registration/backends/simple/urls.py create mode 100644 registration/backends/simple/views.py create mode 100644 registration/forms.py create mode 100644 registration/locale/ar/LC_MESSAGES/django.mo create mode 100644 registration/locale/ar/LC_MESSAGES/django.po create mode 100644 registration/locale/bg/LC_MESSAGES/django.mo create mode 100644 registration/locale/bg/LC_MESSAGES/django.po create mode 100644 registration/locale/ca/LC_MESSAGES/django.mo create mode 100644 registration/locale/ca/LC_MESSAGES/django.po create mode 100644 registration/locale/cs/LC_MESSAGES/django.mo create mode 100644 registration/locale/cs/LC_MESSAGES/django.po create mode 100644 registration/locale/da/LC_MESSAGES/django.mo create mode 100644 registration/locale/da/LC_MESSAGES/django.po create mode 100644 registration/locale/de/LC_MESSAGES/django.mo create mode 100644 registration/locale/de/LC_MESSAGES/django.po create mode 100644 registration/locale/el/LC_MESSAGES/django.mo create mode 100644 registration/locale/el/LC_MESSAGES/django.po create mode 100644 registration/locale/en/LC_MESSAGES/django.mo create mode 100644 registration/locale/en/LC_MESSAGES/django.po create mode 100644 registration/locale/es/LC_MESSAGES/django.mo create mode 100644 registration/locale/es/LC_MESSAGES/django.po create mode 100644 registration/locale/es_AR/LC_MESSAGES/django.mo create mode 100644 registration/locale/es_AR/LC_MESSAGES/django.po create mode 100644 registration/locale/fa/LC_MESSAGES/django.mo create mode 100644 registration/locale/fa/LC_MESSAGES/django.po create mode 100644 registration/locale/fr/LC_MESSAGES/django.mo create mode 100644 registration/locale/fr/LC_MESSAGES/django.po create mode 100644 registration/locale/he/LC_MESSAGES/django.mo create mode 100644 registration/locale/he/LC_MESSAGES/django.po create mode 100644 registration/locale/hr/LC_MESSAGES/django.mo create mode 100644 registration/locale/hr/LC_MESSAGES/django.po create mode 100644 registration/locale/is/LC_MESSAGES/django.mo create mode 100644 registration/locale/is/LC_MESSAGES/django.po create mode 100644 registration/locale/it/LC_MESSAGES/django.mo create mode 100644 registration/locale/it/LC_MESSAGES/django.po create mode 100644 registration/locale/ja/LC_MESSAGES/django.mo create mode 100644 registration/locale/ja/LC_MESSAGES/django.po create mode 100644 registration/locale/ko/LC_MESSAGES/django.mo create mode 100644 registration/locale/ko/LC_MESSAGES/django.po create mode 100644 registration/locale/nb/LC_MESSAGES/django.mo create mode 100644 registration/locale/nb/LC_MESSAGES/django.po create mode 100644 registration/locale/nl/LC_MESSAGES/django.mo create mode 100644 registration/locale/nl/LC_MESSAGES/django.po create mode 100644 registration/locale/pl/LC_MESSAGES/django.mo create mode 100644 registration/locale/pl/LC_MESSAGES/django.po create mode 100644 registration/locale/pt/LC_MESSAGES/django.mo create mode 100644 registration/locale/pt/LC_MESSAGES/django.po create mode 100644 registration/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 registration/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 registration/locale/ru/LC_MESSAGES/django.mo create mode 100644 registration/locale/ru/LC_MESSAGES/django.po create mode 100644 registration/locale/sl/LC_MESSAGES/django.mo create mode 100644 registration/locale/sl/LC_MESSAGES/django.po create mode 100644 registration/locale/sr/LC_MESSAGES/django.mo create mode 100644 registration/locale/sr/LC_MESSAGES/django.po create mode 100644 registration/locale/sv/LC_MESSAGES/django.mo create mode 100644 registration/locale/sv/LC_MESSAGES/django.po create mode 100644 registration/locale/tr_TR/LC_MESSAGES/django.mo create mode 100644 registration/locale/tr_TR/LC_MESSAGES/django.po create mode 100644 registration/locale/zh_CN/LC_MESSAGES/django.mo create mode 100644 registration/locale/zh_CN/LC_MESSAGES/django.po create mode 100644 registration/locale/zh_TW/LC_MESSAGES/django.mo create mode 100644 registration/locale/zh_TW/LC_MESSAGES/django.po create mode 100644 registration/management/__init__.py create mode 100644 registration/management/commands/__init__.py create mode 100644 registration/management/commands/cleanupregistration.py create mode 100644 registration/models.py create mode 100644 registration/signals.py create mode 100644 registration/tests/__init__.py create mode 100644 registration/tests/default_backend.py create mode 100644 registration/tests/forms.py create mode 100644 registration/tests/models.py create mode 100644 registration/tests/simple_backend.py create mode 100644 registration/tests/urls.py create mode 100644 registration/urls.py create mode 100644 registration/views.py create mode 100644 templates/registration/activate.html create mode 100644 templates/registration/activation_complete.html create mode 100644 templates/registration/activation_email.txt create mode 100644 templates/registration/activation_email_subject.txt create mode 100644 templates/registration/base.html create mode 100644 templates/registration/login.html create mode 100644 templates/registration/login_error.html create mode 100644 templates/registration/logout.html create mode 100644 templates/registration/password_change_done.html create mode 100644 templates/registration/password_change_form.html create mode 100755 templates/registration/password_reset_complete.html create mode 100755 templates/registration/password_reset_confirm.html create mode 100755 templates/registration/password_reset_done.html create mode 100755 templates/registration/password_reset_email.html create mode 100755 templates/registration/password_reset_form.html create mode 100644 templates/registration/registration_complete.html create mode 100644 templates/registration/registration_form.html diff --git a/accounts/models.py b/accounts/models.py index ffbae91b..d9f68f8b 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -28,7 +28,7 @@ class UserManager(BaseUserManager): user= self.model( email = UserManager.normalize_email(email),first_name = first_name,last_name = last_name, - is_staff=False, is_active=True, is_superuser=False, + is_staff=False, is_active=False, is_superuser=False, last_login=now, date_joined=now, **extra_fields ) @@ -80,7 +80,7 @@ class User(AbstractBaseUser, PermissionsMixin): url = models.SlugField(blank=True) # - is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле + is_active = models.BooleanField(default=0) # СДЕЛАТЬ проверку на емейле is_staff = models.BooleanField(default=0) is_admin = models.BooleanField(default=0) diff --git a/accounts/urls.py b/accounts/urls.py index d777473b..a867aad8 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -3,8 +3,8 @@ from django.conf.urls import patterns, include, url from django.contrib.auth.views import login, logout urlpatterns = patterns('', - url(r'^login/', login, {'template_name': 'admin/login.html' }), - url(r'^logout', logout, {'next_page': '/accounts/login/'}), + url(r'^login_admin/', login, {'template_name': 'admin/login.html' }), + url(r'^logout_admin', logout, {'next_page': '/accounts/login_admin/'}), url(r'^registration/$', 'accounts.views.registration'), url(r'^create_admin/$', 'accounts.views.create_admin'), url(r'^create_md5user/$', 'accounts.views.create_md5'), @@ -12,5 +12,4 @@ urlpatterns = patterns('', # url(r'^change/(?P\d+).*/$', 'accounts.views.user_change'), url(r'^all/$', 'accounts.views.user_all'), url(r'^reset_password_email/$', 'accounts.views.reset_password_email'), - ) \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 329a5429..a3e5746e 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -87,11 +87,16 @@ def create_md5(request): return render_to_response('create_admin.html', args) +from django.core.mail import EmailMessage + + def registration(request): if request.POST: form = UserCreationForm(request.POST) if form.is_valid(): - form.save() + user = form.save() + email = EmailMessage('Subject', 'Body', to=['%s'%user.email]) + email.send() return HttpResponseRedirect('/accounts/registration') else: form = UserCreationForm() diff --git a/news/urls.py b/news/urls.py index 3ba8f27c..678ef3eb 100644 --- a/news/urls.py +++ b/news/urls.py @@ -5,6 +5,7 @@ urlpatterns = patterns('news.views', url(r'^add.*/$', 'news_add'), url(r'^change/(.*)/$', 'news_change'), url(r'^all/$', 'news_all'), + #ajax url(r'^event/$', 'get_event_id'), ) diff --git a/news/views.py b/news/views.py index 371af012..ecf9f1fc 100644 --- a/news/views.py +++ b/news/views.py @@ -151,7 +151,7 @@ def news_change(request, url): def get_event_id(request): """ - + get events(expostions or conferences) """ if request.GET['model'] != 'None': diff --git a/proj/admin_urls.py b/proj/admin_urls.py new file mode 100644 index 00000000..c2fe61e6 --- /dev/null +++ b/proj/admin_urls.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, include, url + + +urlpatterns = patterns('', + url(r'^$', 'proj.views.home', name='home'), + url(r'^accounts/', include('registration.backends.default.urls')), + url(r'^accounts/', include('accounts.urls')), + url(r'^article/', include('article.urls')), + url(r'^city/', include('city.urls')), + url(r'^company/', include('company.urls')), + url(r'^conference/', include('conference.urls')), + url(r'^country/', include('country.urls')), + url(r'^exposition/', include('exposition.urls')), + url(r'^file/', include('file.urls')), + url(r'^news/', include('news.urls')), + url(r'^organiser/', include('organiser.urls')), + url(r'^place_conference/', include('place_conference.urls')), + url(r'^place_exposition/', include('place_exposition.urls')), + url(r'^seminar/', include('seminar.urls')), + url(r'^service/', include('service.urls')), + url(r'^theme/', include('theme.urls')), + url(r'^translator/', include('translator.urls')), + url(r'^webinar/', include('webinar.urls')), + url(r'^settings/$', 'proj.views.settings'), + url(r'^language/add/', 'directories.views.language_add'), + url(r'^currency/add/', 'directories.views.currency_add'), + # + url(r'^test/', 'proj.views.test'), + #ajax requests + url(r'^ajax_post_file/(?P\d+)/$', 'proj.views.ajax_post_file'),#must be before /ajax_post_file/ + url(r'^ajax_post_file/', 'proj.views.ajax_post_file'), + url(r'^ajax_delete_file/', 'proj.views.ajax_delete_file'), + url(r'^ajax_city/', 'proj.views.ajax_city'), + url(r'^ajax_tag/', 'proj.views.ajax_tag'), + # + url(r'^ckeditor/', include('ckeditor.urls')), +) diff --git a/proj/settings.py b/proj/settings.py index 104d2d88..72631fb3 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -22,11 +22,6 @@ DATABASES = { } } -EMAIL_USE_TLS = True -EMAIL_HOST = 'smtp.gmail.com' -EMAIL_HOST_USER = 'kotzillla@gmail.com' -EMAIL_HOST_PASSWORD = 'fitter2006' -EMAIL_PORT = 587 # Hosts/domain names that are valid for this site; required if DEBUG is False # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts @@ -170,7 +165,17 @@ TEMPLATE_DIRS = ( AUTH_USER_MODEL = 'accounts.User' #AUTH_PROFILE_MODULE = 'accounts.UserProfile' -LOGIN_REDIRECT_URL = '/country/all' +LOGIN_REDIRECT_URL = '' + +#registration info +ACCOUNT_ACTIVATION_DAYS=2 +EMAIL_USE_TLS = True +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_HOST_USER = 'kotzillla@gmail.com' +EMAIL_HOST_PASSWORD = 'fitter2006' +EMAIL_PORT = 587 +DEFAULT_FROM_EMAIL = 'kotzillla@gmail.com' + #AUTHENTICATION_BACKENDS = ( # 'django.contrib.auth.backends.ModelBackend', @@ -190,6 +195,8 @@ INSTALLED_APPS = ( 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.humanize', + # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: @@ -209,6 +216,7 @@ INSTALLED_APPS = ( 'place_conference', 'place_exposition', 'proj', + 'registration', 'review', 'seminar', 'service', diff --git a/proj/urls.py b/proj/urls.py index aeddc1ec..c9d37aa4 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -1,17 +1,23 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -from django.contrib.auth.views import login, logout # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() -#from country.views import city_change +urlpatterns = patterns('', + url(r'^$', 'proj.views.home', name='home'), + url(r'^admin/', include('proj.admin_urls')), + url(r'^accounts/', include('registration.backends.default.urls')), + + #uncomment to enable django admin + #url(r'^admin/', include(admin.site.urls)), + ) +''' urlpatterns = patterns('', - # Examples: - #url(r'^accounts/login/', login, {'template_name': 'admin/login.html' }), - # url(r'^logout', logout, {'next_page':'/accounts/login/'}), + url(r'^$', 'proj.views.home', name='home'), + url(r'^accounts/', include('registration.backends.default.urls')), url(r'^accounts/', include('accounts.urls')), url(r'^article/', include('article.urls')), url(r'^city/', include('city.urls')), @@ -45,3 +51,4 @@ urlpatterns = patterns('', #-------------------------- url(r'^admin/', include(admin.site.urls)), ) +''' \ No newline at end of file diff --git a/proj/views.py b/proj/views.py index 69d1021b..3bb74bf1 100644 --- a/proj/views.py +++ b/proj/views.py @@ -18,6 +18,9 @@ from django.shortcuts import get_object_or_404 from django.db.models.loading import get_model +def home(request): + return render_to_response('base.html') + @login_required def settings(request): """ diff --git a/registration/__init__.py b/registration/__init__.py new file mode 100644 index 00000000..6e1954ab --- /dev/null +++ b/registration/__init__.py @@ -0,0 +1,22 @@ +VERSION = (1, 0, 0, 'final', 0) + + +def get_version(): + "Returns a PEP 386-compliant version number from VERSION." + assert len(VERSION) == 5 + assert VERSION[3] in ('alpha', 'beta', 'rc', 'final') + + # Now build the two parts of the version number: + # main = X.Y[.Z] + # sub = .devN - for pre-alpha releases + # | {a|b|c}N - for alpha, beta and rc releases + + parts = 2 if VERSION[2] == 0 else 3 + main = '.'.join(str(x) for x in VERSION[:parts]) + + sub = '' + if VERSION[3] != 'final': + mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'c'} + sub = mapping[VERSION[3]] + str(VERSION[4]) + + return str(main + sub) diff --git a/registration/admin.py b/registration/admin.py new file mode 100644 index 00000000..6541f6a6 --- /dev/null +++ b/registration/admin.py @@ -0,0 +1,46 @@ +from django.contrib import admin +from django.contrib.sites.models import RequestSite +from django.contrib.sites.models import Site +from django.utils.translation import ugettext_lazy as _ + +from registration.models import RegistrationProfile + + +class RegistrationAdmin(admin.ModelAdmin): + actions = ['activate_users', 'resend_activation_email'] + list_display = ('user', 'activation_key_expired') + raw_id_fields = ['user'] + search_fields = ('user__username', 'user__first_name', 'user__last_name') + + def activate_users(self, request, queryset): + """ + Activates the selected users, if they are not alrady + activated. + + """ + for profile in queryset: + RegistrationProfile.objects.activate_user(profile.activation_key) + activate_users.short_description = _("Activate users") + + def resend_activation_email(self, request, queryset): + """ + Re-sends activation emails for the selected users. + + Note that this will *only* send activation emails for users + who are eligible to activate; emails will not be sent to users + whose activation keys have expired or who have already + activated. + + """ + if Site._meta.installed: + site = Site.objects.get_current() + else: + site = RequestSite(request) + + for profile in queryset: + if not profile.activation_key_expired(): + profile.send_activation_email(site) + resend_activation_email.short_description = _("Re-send activation emails") + + +admin.site.register(RegistrationProfile, RegistrationAdmin) diff --git a/registration/auth_urls.py b/registration/auth_urls.py new file mode 100644 index 00000000..8515ee1b --- /dev/null +++ b/registration/auth_urls.py @@ -0,0 +1,60 @@ +""" +URL patterns for the views included in ``django.contrib.auth``. + +Including these URLs (via the ``include()`` directive) will set up the +following patterns based at whatever URL prefix they are included +under: + +* User login at ``login/``. + +* User logout at ``logout/``. + +* The two-step password change at ``password/change/`` and + ``password/change/done/``. + +* The four-step password reset at ``password/reset/``, + ``password/reset/confirm/``, ``password/reset/complete/`` and + ``password/reset/done/``. + +The default registration backend already has an ``include()`` for +these URLs, so under the default setup it is not necessary to manually +include these views. Other backends may or may not include them; +consult a specific backend's documentation for details. + +""" + +from django.conf.urls import include +from django.conf.urls import patterns +from django.conf.urls import url + +from django.contrib.auth import views as auth_views + + +urlpatterns = patterns('', + url(r'^login/$', + auth_views.login, + {'template_name': 'registration/login.html'}, + name='auth_login'), + url(r'^logout/$', + auth_views.logout, + {'template_name': 'registration/logout.html'}, + name='auth_logout'), + url(r'^password/change/$', + auth_views.password_change, + name='auth_password_change'), + url(r'^password/change/done/$', + auth_views.password_change_done, + name='auth_password_change_done'), + url(r'^password/reset/$', + auth_views.password_reset, + name='auth_password_reset'), + url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', + auth_views.password_reset_confirm, + name='auth_password_reset_confirm'), + url(r'^password/reset/complete/$', + auth_views.password_reset_complete, + name='auth_password_reset_complete'), + url(r'^password/reset/done/$', + auth_views.password_reset_done, + name='auth_password_reset_done'), +) diff --git a/registration/backends/__init__.py b/registration/backends/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/registration/backends/default/__init__.py b/registration/backends/default/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/registration/backends/default/urls.py b/registration/backends/default/urls.py new file mode 100644 index 00000000..3321c9dc --- /dev/null +++ b/registration/backends/default/urls.py @@ -0,0 +1,50 @@ +""" +URLconf for registration and activation, using django-registration's +default backend. + +If the default behavior of these views is acceptable to you, simply +use a line like this in your root URLconf to set up the default URLs +for registration:: + + (r'^accounts/', include('registration.backends.default.urls')), + +This will also automatically set up the views in +``django.contrib.auth`` at sensible default locations. + +If you'd like to customize registration behavior, feel free to set up +your own URL patterns for these views instead. + +""" + + +from django.conf.urls import patterns +from django.conf.urls import include +from django.conf.urls import url +from django.views.generic.base import TemplateView + +from registration.backends.default.views import ActivationView +from registration.backends.default.views import RegistrationView + + +urlpatterns = patterns('', + url(r'^activate/complete/$', + TemplateView.as_view(template_name='registration/activation_complete.html'), + name='registration_activation_complete'), + # Activation keys get matched by \w+ instead of the more specific + # [a-fA-F0-9]{40} because a bad activation key should still get to the view; + # that way it can return a sensible "invalid key" message instead of a + # confusing 404. + url(r'^activate/(?P\w+)/$', + ActivationView.as_view(), + name='registration_activate'), + url(r'^register/$', + RegistrationView.as_view(), + name='registration_register'), + url(r'^register/complete/$', + TemplateView.as_view(template_name='registration/registration_complete.html'), + name='registration_complete'), + url(r'^register/closed/$', + TemplateView.as_view(template_name='registration/registration_closed.html'), + name='registration_disallowed'), + (r'', include('registration.auth_urls')), + ) diff --git a/registration/backends/default/views.py b/registration/backends/default/views.py new file mode 100644 index 00000000..402e3463 --- /dev/null +++ b/registration/backends/default/views.py @@ -0,0 +1,130 @@ +from django.conf import settings +from django.contrib.sites.models import RequestSite +from django.contrib.sites.models import Site + +from registration import signals +from registration.models import RegistrationProfile +from registration.views import ActivationView as BaseActivationView +from registration.views import RegistrationView as BaseRegistrationView + + +class RegistrationView(BaseRegistrationView): + """ + A registration backend which follows a simple workflow: + + 1. User signs up, inactive account is created. + + 2. Email is sent to user with activation link. + + 3. User clicks activation link, account is now active. + + Using this backend requires that + + * ``registration`` be listed in the ``INSTALLED_APPS`` setting + (since this backend makes use of models defined in this + application). + + * The setting ``ACCOUNT_ACTIVATION_DAYS`` be supplied, specifying + (as an integer) the number of days from registration during + which a user may activate their account (after that period + expires, activation will be disallowed). + + * The creation of the templates + ``registration/activation_email_subject.txt`` and + ``registration/activation_email.txt``, which will be used for + the activation email. See the notes for this backends + ``register`` method for details regarding these templates. + + Additionally, registration can be temporarily closed by adding the + setting ``REGISTRATION_OPEN`` and setting it to + ``False``. Omitting this setting, or setting it to ``True``, will + be interpreted as meaning that registration is currently open and + permitted. + + Internally, this is accomplished via storing an activation key in + an instance of ``registration.models.RegistrationProfile``. See + that model and its custom manager for full documentation of its + fields and supported operations. + + """ + def register(self, request, **cleaned_data): + """ + Given a username, email address and password, register a new + user account, which will initially be inactive. + + Along with the new ``User`` object, a new + ``registration.models.RegistrationProfile`` will be created, + tied to that ``User``, containing the activation key which + will be used for this account. + + An email will be sent to the supplied email address; this + email should contain an activation link. The email will be + rendered using two templates. See the documentation for + ``RegistrationProfile.send_activation_email()`` for + information about these templates and the contexts provided to + them. + + After the ``User`` and ``RegistrationProfile`` are created and + the activation email is sent, the signal + ``registration.signals.user_registered`` will be sent, with + the new ``User`` as the keyword argument ``user`` and the + class of this backend as the sender. + + """ + first_name, last_name, email, password = cleaned_data['first_name'],cleaned_data['last_name'], cleaned_data['email'], cleaned_data['password1'] + if Site._meta.installed: + site = Site.objects.get_current() + else: + site = RequestSite(request) + new_user = RegistrationProfile.objects.create_inactive_user(first_name, last_name, email, + password, site) + signals.user_registered.send(sender=self.__class__, + user=new_user, + request=request) + return new_user + + def registration_allowed(self, request): + """ + Indicate whether account registration is currently permitted, + based on the value of the setting ``REGISTRATION_OPEN``. This + is determined as follows: + + * If ``REGISTRATION_OPEN`` is not specified in settings, or is + set to ``True``, registration is permitted. + + * If ``REGISTRATION_OPEN`` is both specified and set to + ``False``, registration is not permitted. + + """ + return getattr(settings, 'REGISTRATION_OPEN', True) + + def get_success_url(self, request, user): + """ + Return the name of the URL to redirect to after successful + user registration. + + """ + return ('registration_complete', (), {}) + + +class ActivationView(BaseActivationView): + def activate(self, request, activation_key): + """ + Given an an activation key, look up and activate the user + account corresponding to that key (if possible). + + After successful activation, the signal + ``registration.signals.user_activated`` will be sent, with the + newly activated ``User`` as the keyword argument ``user`` and + the class of this backend as the sender. + + """ + activated_user = RegistrationProfile.objects.activate_user(activation_key) + if activated_user: + signals.user_activated.send(sender=self.__class__, + user=activated_user, + request=request) + return activated_user + + def get_success_url(self, request, user): + return ('registration_activation_complete', (), {}) diff --git a/registration/backends/simple/__init__.py b/registration/backends/simple/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/registration/backends/simple/urls.py b/registration/backends/simple/urls.py new file mode 100644 index 00000000..0be6ee22 --- /dev/null +++ b/registration/backends/simple/urls.py @@ -0,0 +1,36 @@ +""" +URLconf for registration and activation, using django-registration's +one-step backend. + +If the default behavior of these views is acceptable to you, simply +use a line like this in your root URLconf to set up the default URLs +for registration:: + + (r'^accounts/', include('registration.backends.simple.urls')), + +This will also automatically set up the views in +``django.contrib.auth`` at sensible default locations. + +If you'd like to customize registration behavior, feel free to set up +your own URL patterns for these views instead. + +""" + + +from django.conf.urls import include +from django.conf.urls import patterns +from django.conf.urls import url +from django.views.generic.base import TemplateView + +from registration.backends.simple.views import RegistrationView + + +urlpatterns = patterns('', + url(r'^register/$', + RegistrationView.as_view(), + name='registration_register'), + url(r'^register/closed/$', + TemplateView.as_view(template_name='registration/registration_closed.html'), + name='registration_disallowed'), + (r'', include('registration.auth_urls')), + ) diff --git a/registration/backends/simple/views.py b/registration/backends/simple/views.py new file mode 100644 index 00000000..0c851729 --- /dev/null +++ b/registration/backends/simple/views.py @@ -0,0 +1,45 @@ +from django.conf import settings +from django.contrib.auth import authenticate +from django.contrib.auth import login +from django.contrib.auth.models import User + +from registration import signals +from registration.views import RegistrationView as BaseRegistrationView + + +class RegistrationView(BaseRegistrationView): + """ + A registration backend which implements the simplest possible + workflow: a user supplies a username, email address and password + (the bare minimum for a useful account), and is immediately signed + up and logged in). + + """ + def register(self, request, **cleaned_data): + username, email, password = cleaned_data['username'], cleaned_data['email'], cleaned_data['password1'] + User.objects.create_user(username, email, password) + + new_user = authenticate(username=username, password=password) + login(request, new_user) + signals.user_registered.send(sender=self.__class__, + user=new_user, + request=request) + return new_user + + def registration_allowed(self, request): + """ + Indicate whether account registration is currently permitted, + based on the value of the setting ``REGISTRATION_OPEN``. This + is determined as follows: + + * If ``REGISTRATION_OPEN`` is not specified in settings, or is + set to ``True``, registration is permitted. + + * If ``REGISTRATION_OPEN`` is both specified and set to + ``False``, registration is not permitted. + + """ + return getattr(settings, 'REGISTRATION_OPEN', True) + + def get_success_url(self, request, user): + return (user.get_absolute_url(), (), {}) diff --git a/registration/forms.py b/registration/forms.py new file mode 100644 index 00000000..5197d7f5 --- /dev/null +++ b/registration/forms.py @@ -0,0 +1,131 @@ +""" +Forms and validation code for user registration. + +Note that all of these forms assume Django's bundle default ``User`` +model; since it's not possible for a form to anticipate in advance the +needs of custom user models, you will need to write your own forms if +you're using a custom model. + +""" +try: + from django.contrib.auth import get_user_model + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User + + +#from django.contrib.auth.models import User +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class RegistrationForm(forms.Form): + """ + Form for registering a new user account. + + Validates that the requested username is not already in use, and + requires the password to be entered twice to catch typos. + + Subclasses should feel free to add any additional validation they + need, but should avoid defining a ``save()`` method -- the actual + saving of collected user data is delegated to the active + registration backend. + + """ + required_css_class = 'required' + + first_name = forms.RegexField(regex=r'^[\w.@+-]+$', + max_length=30, + label=_("First name"), + error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) + last_name = forms.RegexField(regex=r'^[\w.@+-]+$', + max_length=30, + label=_("Last name"), + error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) + + email = forms.EmailField(label=_("E-mail")) + password1 = forms.CharField(widget=forms.PasswordInput, + label=_("Password")) + password2 = forms.CharField(widget=forms.PasswordInput, + label=_("Password (again)")) + ''' + def clean_username(self): + """ + Validate that the username is alphanumeric and is not already + in use. + + """ + existing = User.objects.filter(username__iexact=self.cleaned_data['username']) + if existing.exists(): + raise forms.ValidationError(_("A user with that username already exists.")) + else: + return self.cleaned_data['username'] + ''' + + def clean(self): + """ + Verifiy that the values entered into the two password fields + match. Note that an error here will end up in + ``non_field_errors()`` because it doesn't apply to a single + field. + + """ + if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: + if self.cleaned_data['password1'] != self.cleaned_data['password2']: + raise forms.ValidationError(_("The two password fields didn't match.")) + return self.cleaned_data + + +class RegistrationFormTermsOfService(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which adds a required checkbox + for agreeing to a site's Terms of Service. + + """ + tos = forms.BooleanField(widget=forms.CheckboxInput, + label=_(u'I have read and agree to the Terms of Service'), + error_messages={'required': _("You must agree to the terms to register")}) + + +class RegistrationFormUniqueEmail(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which enforces uniqueness of + email addresses. + + """ + def clean_email(self): + """ + Validate that the supplied email address is unique for the + site. + + """ + if User.objects.filter(email__iexact=self.cleaned_data['email']): + raise forms.ValidationError(_("This email address is already in use. Please supply a different email address.")) + return self.cleaned_data['email'] + + +class RegistrationFormNoFreeEmail(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which disallows registration with + email addresses from popular free webmail services; moderately + useful for preventing automated spam registrations. + + To change the list of banned domains, subclass this form and + override the attribute ``bad_domains``. + + """ + bad_domains = ['aim.com', 'aol.com', 'email.com', 'gmail.com', + 'googlemail.com', 'hotmail.com', 'hushmail.com', + 'msn.com', 'mail.ru', 'mailinator.com', 'live.com', + 'yahoo.com'] + + def clean_email(self): + """ + Check the supplied email address against a list of known free + webmail domains. + + """ + email_domain = self.cleaned_data['email'].split('@')[1] + if email_domain in self.bad_domains: + raise forms.ValidationError(_("Registration using free email addresses is prohibited. Please supply a different email address.")) + return self.cleaned_data['email'] \ No newline at end of file diff --git a/registration/locale/ar/LC_MESSAGES/django.mo b/registration/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..07bc79f1242872c701e463e947846ef4e77f8ceb GIT binary patch literal 2135 zcmb`GO>Y}j6oxO*QffYhKrCQ!#Dcy6I+Tvl^ALK%-lJj?>YYCZ?1GEo`4N|6c3G!#`-*whp((Yy+m z-Kr90Rd=-srEvqF+S>K&w8ZwRDP50btrjY+l_pnHD-0U$E!U`8n&vzuwIbbawY(LQ zRCAY>RH%G2>X;Ul20TZCaVY6=c`M{{PW8Cq;1c?>sfHsNd0Y8MfvSxlKzY&+&~%s< z3w;kwRq0dUqvmSh8;Sg$GDd~^BKhs+Ej+}Uwf!0%s{xu9H-k1c+uDo@2_FavRl`_7 z6&~A}l@|1d*qUo>Nv*#O!Wt=AZIE%BO312lmlMTrs}(V#ju_YN1^9MlBqu` z3}eal)QN{$utM<<%OvK);0skXPNC*3qAg51OLMuYPjWZ%w3si?7iMQtWz`Bo)NRVSxU{#R-7r!ir2%LmPTdiQYQ1hlbLYFCTMIT`)+OY?*SF{c@gpRgwgbFt8Js8F>X~IztA(6go@3S{MAyi!7zXaki z`?ib9SJPtHfr}r`&fN@Gz>eI+M)JVgbpEe0pa?4w3p@}92mg_=6F0I0Ju$062%PoO ziTdj-=q`RB&d+EWA|2cDEQeAJX4!#dFIu(VvSp8Z~sGVt;dyNyAm~cwR)@sXJ^ro7AAbs!, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "اسم المستخدم" + +#: forms.py:41 +msgid "email address" +msgstr "عنوان البريد الالكتروني" + +#: forms.py:43 +msgid "password" +msgstr "كلمة المرور" + +#: forms.py:45 +msgid "password (again)" +msgstr "تأكيد كلمة المرور" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "يمكن أن يحتوي اسم المستخدم على احرف، ارقام وشرطات سطرية فقط" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "اسم المستخدم مسجل مسبقا. يرجى اختيار اسم اخر." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "يجب ادخال كلمة المرور مطابقة كل مرة" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "أقر بقراءة والموافقة على شروط الخدمة" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "يجب الموافقة على الشروط للتسجيل" + +#: forms.py:124 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "عنوان البريد الالكتروني مسجل مسبقا. يرجى تزويد عنوان بريد الكتروني مختلف." + +#: forms.py:149 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "يمنع التسجيل باستخدام عناوين بريد الكترونية مجانية. يرجى تزويد عنوان بريد الكتروني مختلف." + +#: models.py:188 +msgid "user" +msgstr "مستخدم" + +#: models.py:189 +msgid "activation key" +msgstr "رمز التفعيل" + +#: models.py:194 +msgid "registration profile" +msgstr "ملف التسجيل الشخصي" + +#: models.py:195 +msgid "registration profiles" +msgstr "ملفات التسجيل الشخصية" diff --git a/registration/locale/bg/LC_MESSAGES/django.mo b/registration/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..be9adf4d3defce5ee8274e2cb996d8c63100a637 GIT binary patch literal 2302 zcmb7D&u<$=6doW@Fi;QzaR9^<5~875V>f~(ZmF7vP(`Gvl{yh{sV4TsUSjWByJOP` zA(6DAr3iwAdZ{XbxNzX&{4lZNB)uWH&7P6C@E7nG!1reTBZ0IME3dzqH*eni-uK@A z@yx(2f#+$wFXFv}_jz7FfImD}fDUj8cp3O3a2j~zK_T7(&H+yWzXHAn{0%q={0n## z_`*X%JPCXq_$Y7$$hpRV&jM$F&jE|T0pO=V_FDml$n_;~9{ay>_!DscVQ>K+eME>4 zfj5Ak0RIG*fR~TNe0~KI_5%p^67W^v6Torc%fKv)zd)B%POgAO_ox=SUXd2qUsa@ACRr#1DhyRfZb;R@FS+xsR)r*G z%Swid!dkUjULr{acVR&V%F_ogCPl7F<(e>{w z=$I^m=%9!*by|gHEVyNLs4*0*ko{wsL^kk0QhDu67MwYhg-&NEJ2w8_*!c;Xo0z#Y zd2u>1qpE(OoeN>nEjZ_D#n8$58A@a?=A3c#ipRrwM{1R!6RFfmCpGG%M=3p;8BRH= zH&ZD%Iy0*7a`3+2h?5$|F{MvrhEE<(;bvk=hT6#m(hJK{`$2~0%Cg{MQ>WAQ?lM_% zwO>D5(==_0mZO_yhfJ%xvW5-QHjQW*9=otp zbQSBi*)!{=6|F`qra@+l|C(kSCwJ{xgYD7h>>QV38zq2l?C4Dw%aKUWaiL?lvNOZGl6}*0j4XSdV5K z{@a$z9s=$%_q)*G3)2whn_g;I?Gc3ew?7xxyJH!)Yzg25TxXv5*S$l>O^8Fs#qL1Y4YX*5 zplBl=gU#qB!u}jv*Fb!mTR%j$z1MJrCgBGOQ5XgZ#X%qVY@3!aKVZ8GYEY#YGj2UP z*BveH`u#>L=E4KR`t)b1g*{JA6GeW@XVDF0<=(`!7=lZ!h414IQ&Y_AwX~$h^OT_-o)f, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2008-03-05 12:37+0200\n" +"Last-Translator: Vladislav \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,10,-1,-1,-1,-1,-1\n" + +#: forms.py:38 +msgid "username" +msgstr "Потребителско име " + +#: forms.py:41 +msgid "email address" +msgstr "Електронна поща" + +#: forms.py:43 +msgid "password" +msgstr "Парола" + +#: forms.py:45 +msgid "password (again)" +msgstr "Парола (проверка)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Потребителските имена могат да съдържат букви, цифри и подчертавки" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Потребителското име е заето. Моля изберето друго." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "Грешка при проверка на паролата." + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "Прочел съм и съм съгласен с условията за експлоатация" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "Трябва да сте съгласни с условията за да се регистрирате." + +#: forms.py:124 +msgid "This email address is already in use. Please supply a different email address." +msgstr "Адреса на електронната поща е използван. Моля въведете друг адрес." + +#: forms.py:149 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "Регистрациите с безплатни адреси е забранен. Моля въведете различен адрес за електронна поща" + +#: models.py:188 +msgid "user" +msgstr "Потребител" + +#: models.py:189 +msgid "activation key" +msgstr "Ключ за активация" + +#: models.py:194 +msgid "registration profile" +msgstr "регистрационен профил" + +#: models.py:195 +msgid "registration profiles" +msgstr "регистрационни профили" + diff --git a/registration/locale/ca/LC_MESSAGES/django.mo b/registration/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..f81a71eaf1ffb7863db27b37c883eb47b46046aa GIT binary patch literal 1953 zcmb7^O>Y}T7{>=FZ|1$w0}?Nf5GbjdF}A7H)Rc-O4Qdc6R^lQ!!Fc!adcy9EnVEGG z4shceAR$h@RY*us^;W^jUjX%j5E37NTfag7vtB!iR0%QC`nNkX&piKmUi{DLQ{M}W z(|BIN^D~}T@mzWcKN!D)XTe+Gv*6$0W8lA_1n+@QfUiF+#Pi@X_%e7A{2bf`-vV!g z*TBEP%i!`OGrJ62!uJ@A=l=k{1l|PCfWLvKz`NiceEkW&iSPACg?J9kz^G>*?10~Z zPl302G2Y`)At7W0=^X(W8=XW!SBH6??(`F zDqnH^_=xwI4{Q^VES{++VvOQ|jKz2oZ_!sA2v2q2=%axr#x{^*zZp2p6O^gstro7Br$c_v?u$N3>CO7(Eaj!ige*c5#T4f~eHwKf`R&QlMA)GP%m zR7gf~7tTN7GCG{cNJnM-znsE)qVkfdD1D&Bnt(WvH4vL~2<-d{nX(w*r3!3mQoJS> zw{42+$XQI1_{^5G15U&p)`&Zj;HucM6UV~(B_E2}d>vCnZK!j8;G`F^JVejgJx+q$ zO64a|flPEM-BTvB^2AZC=4xYy$JPb8?K7Rq^)mCaZ@bj!ecYEDD3h2*c?EUUrB18e zmaPl2eSzBTZtMKHR;Sg%M!CZi9i1HQYsuC{**Q<0ceYQr;xf!lR;r9;pH&f!gUY8j7Sm9?y|ul0 zblrBd)!0CmP(iYPIEMVd2jT5;j`l@7_W>G~-pKJV(j{u8yrb zp>#>1WYAWykHJBmr8+@qQQu3`J6^;qIW&qnRL9?GIc0b%tHxwA(aI559Ul#6)s*Pz zZL#UY^v0s`>Vk91p_{1;I@jTAg`QLB(ggm~rP(Qzq4>(_F9GSGUF{LZk`P+Qr8KZK z3cUqkO|hB7%0js+#(3kZRcgghh)-=2og!Rp#99?1*uvfPCYpZkZVyqdl;WoNkE?~H zYT79Zdq-x5_D#Qb&53Cp0Yyl;+Op2>q rMp-@}qW_g08so2d-e68na8?onbs_`UgZ7Qe>YXfRQ&qGUbG7^XoasCd literal 0 HcmV?d00001 diff --git a/registration/locale/ca/LC_MESSAGES/django.po b/registration/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 00000000..7068194c --- /dev/null +++ b/registration/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,97 @@ +# Catalan translation for django-registration. +# Copyright (C) 2007-2010, James Bennet +# This file is distributed under the same license as the django-registration package. +# Carles Barrobés , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-07-17 11:04+0200\n" +"PO-Revision-Date: 2010-09-24 23:21+0100\n" +"Last-Translator: Carles Barrobés i Meix \n" +"Language-Team: Català\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Catalan\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Activar usuaris" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Re-enviar e-mails d'activació" + +#: forms.py:35 +msgid "Username" +msgstr "Nom d'usuari" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Aquest valor ha de contenir només lletres, números i guions baixos" + +#: forms.py:39 +msgid "E-mail" +msgstr "E-mail" + +#: forms.py:41 +msgid "Password" +msgstr "Contrasenya" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Contrasenya (de nou)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Ja existeix un usuari amb aquest nom" + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Els dos camps de contrasenya no coincideixen" + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "He llegit i estic d'acord amb les condicions d'ús" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Heu d'estar d'acord amb les condicions d'ús per registrar-vos" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Aquesta adreça d'e-mail ja està sent utilitzada. Sisplau, entreu-ne una " +"altra." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Està prohibit registrar-se utilitzant adreces d'e-mail gratuïtes. Sisplau " +"entreu-ne una altra." + +#: models.py:168 +msgid "user" +msgstr "usuari" + +#: models.py:169 +msgid "activation key" +msgstr "clau d'activació" + +#: models.py:174 +msgid "registration profile" +msgstr "perfil de registre" + +#: models.py:175 +msgid "registration profiles" +msgstr "perfils de registre" + +#~ msgid "Email address" +#~ msgstr "Adreça d'e-mail" diff --git a/registration/locale/cs/LC_MESSAGES/django.mo b/registration/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..7c98a7bf3d102bbe134c3563eafe6ca23fb4811e GIT binary patch literal 1963 zcmb7^&u<$=6vqcB6wL1m4oH9=2WTU@8z(AKF`v36#i zIydg*NF|OvaHxa@TsTw^32k!W#Dx=5#ToGjaO6AdA8DmtI`Zsic6Q#pH{W^B56+$W zMxdQTe;fUK^movgp27p|M{o}O348_o3w#;;2Moafz~{jao)+RYa2|XMTn4`ccfj|- z``|kGH+Th{e@2M&pa%WEcfdEm@4z>~``{Vy576)bC-?!6QEf0TTTt6<6?yswM43zWE7=rt*BE+4w$?JNsZo4naLUK z$<*XDv1ImWi_?K>v1mwZ_e~nj26RETrP6a^lLO1%e(X#cP3#?6d}$+&R60MGS*6>w z=Y15Pr*W_)WvQQr&1{&89$LzSPx{JF(sLG)H2#Z2QnJL#_SxY_9E#l*~Op` zHq#M?Ed$j;vqGAJQU;kiIfm)PsRM$Nh^GE6c3*gqLG>| zw_H$;Kw^%~u*ZEn>!)=Qh*H>nHOY+FUaXIa|@O;e##W1|_YAU*u` z1y_+q6$p zT3x@s?N6|@y1E>z(4_6tH5F>v(pr73c6#82uv}WfJt2pJ=CF^0IKJ)X;aurY2tHHG z?$hn&wczsUIv*$UE~x32iIBS$x{L%ZiS3i4qNrlRjpd^Rx7JPadzusKs*|H}@nu~` z`SnnK1_emj)P_YZ@Wo*U`CU{1QbLNx$+vub$S$U?#U@rE=dH;)v9#D8Uiv0V@{#Vz zM3IfL*X~flq9lP(-+Gsxz|jt7|tpWst^@ACLi=Og06=}~|{7VrPb(s!iFTZ<$rMMcTQ4!36jJS(Gl&;c9kg(AnQ0++>}@Su&8l$`uQhIt?U%iW6J}kem=4Z zYk8554>3ew(#z^nFNf>NP^@J*AWmkYiT29Pgda|2_y1Fv?WNGwUtyu*q-aywQlWTQ h^, 2011. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-12 14:09-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Implayo s.r.o. \n" +"Language-Team: LANGUAGE \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Aktivovat uživatele" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Znovu odeslat aktivační e-maily" + +#: forms.py:35 +msgid "username" +msgstr "uživatelské jméno" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Tato hodnota může obsahovat pouze písmena, čísla a podtržítka." + +#: forms.py:39 +msgid "Email address" +msgstr "E-mailová adresa" + +#: forms.py:41 +msgid "Password" +msgstr "Heslo" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Heslo (znovu)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Uživatel s tímto jménem již existuje." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Zadaná 2 hesla se neshodují." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Přečetl jsem si a souhlasím s podmínkami služby" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Musíte odsouhlasit podmínky služby pro pokračování v registraci." + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Tato e-mailová adresa se již používá. Prosím zadejte jinou e-mailovou " +"adresu." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Používání volných e-mailových adres je zakázáno. Prosím zadejte " +"jinou e-mailovou adresu." + +#: models.py:165 +msgid "user" +msgstr "uživatel" + +#: models.py:166 +msgid "activation key" +msgstr "aktivační klíč" + +#: models.py:171 +msgid "registration profile" +msgstr "registrační profil" + +#: models.py:172 +msgid "registration profiles" +msgstr "registrační profily" diff --git a/registration/locale/da/LC_MESSAGES/django.mo b/registration/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..9478680094ac7936d9bc9c4ee8fc684061f52a87 GIT binary patch literal 1803 zcmb7^&u$z=5XKuY5SIT591tMY1!60iu}Ln*gvfDhkfj(bvx!75sCTD!wzECmtL~n4 z_P`s!5y6cYKnSiJf@DrS0*VxIL*jzOi6dXl?5?wdOIn`&&GdA4ee+e7ADmtJN@1ME z^#-o*aJ`A^%47J!_yJr4e*|9u?}N{Se}WnK4|oQA`*EdS0@uOUz-{m|@HY4s_!IaM z_&azNTz{h7=fLxLJ_hCdZ^2i<@4;8WU%(acH}DK%JpeD``43FK2)_PgtLFl^isyGh z(bEH821lUi`5e3rehm`%H@FR+drGNIunTs;FToA)8&LND3Z4V+gQDv%5PxdrX{8`X zJ&Q}cdk)up$al;KmMKVXJd-)`NCv_$#xuB+STbNwGbD!Sk#CV99?18qYg9)LbZpX) z(om=7(dmjw+rYY*65lm3#avzMCo|EBn-x**RoYn6MG-hgwNFDmVUiuB9j-DkQ}Q^I zsmq~?9`%o-yXjPZmxHWaeS!CJY1~c9fOQ481C3FOxWUh|Jl{AnT z&Fi@ij$|T@gCClnNnGS~Xjw<5SdYhcN}38Y7;s>hmN(|A3!&-Q(|D$h28L}Bv7vD1 z6ID9(hq4OiFNKtVbE}Lf<3|dL-4ktVrmBvK`rak@K;A*D<&-$Yi{$F6hnvRO+7-C% zd$^vfn@FAHN`30<_JAedu^YZ438C?hgL=r;5l>Y+Kl2o>4UFagos3GVL>&fyhx;kp zFS1)uflO>saYwt-XG=$INer}uAmKgc#u*GYVoOSb3wzCg)s z(I)Duqjn);V2}#Qy+u70C`3oSP?va9aY2P7Z#Lod#G!vi=pVdo7qQyQq_B0 zAbWBTRp3k1f1k(5pRDJE$ZRFooG)5taYL&mzDbvB>O*#I^R$t$D=s$=2WcCTS4z@n zl{}LW2*J!~B&BFgnR2>ya?h4DVTVV^!Uv+Y@!K3a7rx7MY0)$Twh+BI2zqjO<&e3D z_sIK&ZKg3KryX|F^xt4PDaZ(gLEP%(3mVmq#Q34N@Vw_C4F7n-MM~O=ai{%}tDPnt x;=bCgDUPsW;p?)kH1Lp=7LCI5Y>9{N, 2007-2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Rune Bromer \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Aktiver brugere" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Gensend aktiveringsemails" + +#: forms.py:35 +msgid "Username" +msgstr "Brugernavn" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "V¾rdien mŒ kun indeholde bogstaver, tal og underscore." + +#: forms.py:39 +msgid "Email address" +msgstr "E-mailadresse" + +#: forms.py:41 +msgid "Password" +msgstr "Password" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Password (gentag)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Der findes allerede en bruger med dette brugernavn." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "De 2 passwordfelter er ikke ens." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "I har l¾st og accepterer betingelserne." + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Du skal acceptere betingelserne for at registere" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Denne emailadresse er allerede i brug. Benyt venligst en anden. " + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Registrering med gratis emailadresser er ikke muligt. V¾lg venligst en " +"anden emailadresse" + +#: models.py:165 +msgid "user" +msgstr "bruger" + +#: models.py:166 +msgid "activation key" +msgstr "Aktiveringsn¿gle" + +#: models.py:171 +msgid "registration profile" +msgstr "Registreringsprofil" + +#: models.py:172 +msgid "registration profiles" +msgstr "Registreringprofiler" diff --git a/registration/locale/de/LC_MESSAGES/django.mo b/registration/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..b272d4463c4efb5dec112c20a9fec3364013adfc GIT binary patch literal 1999 zcmbW1O>Z1E7{?8ix8=RONJt<(97Jg6dO_ZqXJ_2ZcviM2 z+vLnAK;p!KFMz6Y0SR%7#F0BfsyO$=kt6?Sb~kCNT)>j|XV2Px{(fHk;Ov=i71~+! zchG-8e;0l63H+el2QPv@f-i%Af-iv&K@I)`J_o-4q*AYfv*6p{GWZpE8$1X80$vCI z0++zqr^fpncpmc+DCd6%EA={f1C)IUcp3Dd=(z{J z1^x`a2mTI5@NaMi}0M zCMLP8!ucmmiovO?tSICEWE8viOi?qHb%>NyF2WB~IfyMdM)qNbTwV4tXdGL+6vL!~ z*V}3bp_5ptFROZdzzM%&H~fwu_{Mka)gx}*<$X2&KJh8MHn0Vs`Y|ZU61C;4JDfzl zk?Jp?0+HxaddIk|(kG7Uv=^wg&BMw^y%{o_>eV_6x>t3nwRNMXuOLq(j(QFG)TQ}O z=aQc5=(z=&pX+`&|3L>|uuyOFo)s&{>psy~I)91gKJI?h8Lzu$LexEPTqsPee3w2q z&cUtM*rr_2BJ^RpTr|_Rb%ScDbq$(pld@1;Ih$=-&Piq9fmpv%><>x=cxKeBk)$PVcH-I9?~3kZgM0B~^-q?a~6WvZdB6 zOUpIuu`myp>-@mWb+wXQc&5PGF4JXRafotr)*QJJpe zz}jU2C$M#W<1wL(3)n+yqOL-;C2HH|o(}41`Ng9FT^LzLg5_1gsK%9vRXI|R?Gp6D zTO?HqF}Mm%Dii9&T4_;Q*5Q7;Re-;WN^GAL-Q2c@H+?W!Y}2Ymrb8$0OgC|&?3ZlE zEgs)#;1x02mvB02UXsI~JdPr~2`M?7, 2007-2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-18 21:32+0200\n" +"PO-Revision-Date: 2007-09-29 16:50+0200\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Deutsch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Benutzer aktivieren" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Aktivierungs-E-Mail erneut senden" + +#: forms.py:35 +msgid "Username" +msgstr "Benutzername" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten." + +#: forms.py:39 +msgid "Email address" +msgstr "E-Mail-Adresse" + +#: forms.py:41 +msgid "Password" +msgstr "Passwort" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Passwort (wiederholen)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Dieser Benutzername ist bereits vergeben." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Die beiden Passwörter sind nicht identisch." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Ich habe die Nutzungsvereinbarung gelesen und stimme ihr zu" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Sie müssen der Nutzungsvereinbarung zustimmen, um sich zu registrieren" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Diese E-Mail-Adresse wird schon genutzt. Bitte geben Sie eine andere E-Mail-" +"Adresse an." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Die Registrierung mit einer kostenlosen E-Mail-Adresse ist untersagt. Bitte " +"geben Sie eine andere E-Mail-Adresse an." + +#: models.py:165 +msgid "user" +msgstr "Benutzer" + +#: models.py:166 +msgid "activation key" +msgstr "Aktivierungsschlüssel" + +#: models.py:171 +msgid "registration profile" +msgstr "Registrierungsprofil" + +#: models.py:172 +msgid "registration profiles" +msgstr "Registrierungsprofile" diff --git a/registration/locale/el/LC_MESSAGES/django.mo b/registration/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..acc972683e0c03dee9cf816301d9653f1f8bccc3 GIT binary patch literal 2424 zcmbtUO>Y}j6n#LUU_Mn55CWvjiner&-4aOLQq?4G72%{Iae}&n7yHE?YR_0Rr3E=*#C^fI`E}Oh1drE3j7@S z^Ay7hpLKr003n)neQLJQGD1v#e3Q!+==!JGG#qQIq~ zpeUofl27g^4JvQU&MGmW^0ps%GO%5TD!%RHX_Wm{N!mq{xtynbU-@MFRQBA0Jz@tc z7p4B9lD;CpQZ5(ANm9-p9aWxkg2NZ1B2&Q4L%}$dEHb@uvN@-E&~UioIkKbm(g!D+h>kt>HD9$UXGN^7AUYwO2}+rk2N}eU5$%F z-4XZvTMIfV^B{UkG%__ug<*`^MRlan7u+H9!)+4%p8JW)23Akb8b(=|bb|VmUGFEa zq-Z!bFxYdoFEXIYt`}Ine%{Vm?^W`?m2ndk>A#w>x-cu2ht(|um7ue+*gICN(~5Ue zyfbkwX2sfLF*sTSYRu-~2mRu4EB+RpjVIb;Z^Upjl9qm8WjyKlMH#qWf-VoG)6|#j zP0@u^Z?Y$SDcRjUkQyAk2v;Xxk$Gihlq@AEo$R|Z#FQ_j)0c{N)b;WgBfUMnsr{nj z(O9GlbA=AA45pBvK-~!5EEmzg^OP+}&sV{_Lz&A~$G#tPfp)EwlXY{@e}Xz7@`%vi z=q+8ovVa;dD5wcf+}GUf07V(z|+-!Wq36&W2N@7sAQr61Ey!eheqD znADpHvWiesLf<64sn_*7tZU(%Ug03ih&xYuBb;Ynq^)Cv{F}&jCtO6XX{?cxbWQKT zV>_JTT)GaYZRA{J7Hi=b@ZT^8AclnCMKDi*`#LtvV-YW0^;VShEu4XcscnbL*$9`w zWClgSR>i$N#7FT}B;C=qD6=;$SjRcDn8Z2ggGcQi<3%u@HH=|;V74e>5*?d1arc@G zP)dU{=@s;)_TQ*~g(1y^3uayvE`akMxUZ2(xnk;p-79&Gyq~(CEY~Z!T!`R$l`<%-gBm1RRIfs7F)Qt z%HLPrG>tXS8eTPu!UrjuU)BH8s4!o^KUm$zOeghSOs=l0r$jhmW;+K$JAeBZ0Jr;| PvNps)m9q2E`W1fx4LxjP literal 0 HcmV?d00001 diff --git a/registration/locale/el/LC_MESSAGES/django.po b/registration/locale/el/LC_MESSAGES/django.po new file mode 100644 index 00000000..cd38eb1b --- /dev/null +++ b/registration/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,84 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Panos Laganakos , 2007. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2007-11-14 21:50+0200\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "όνομα χρήστη" + +#: forms.py:41 +msgid "email address" +msgstr "διεύθυνση ηλεκτρονικού ταχυδρομείου" + +#: forms.py:43 +msgid "password" +msgstr "συνθηματικό" + +#: forms.py:45 +msgid "password (again)" +msgstr "συνθηματικό (ξανά)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Τα ονόματα χρηστών μπορούν να περιλαμβάνουν μόνο γράμματα, αριθμούς και υπογραμμίσεις" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Αυτό το όνομα χρήστη χρησιμοποίειται ήδη. Παρακαλώ διαλέξτε ένα άλλο." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "Πρέπει να εισάγετε το ίδιο συνθηματικό κάθε φορά" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "Διάβασα και συμφωνώ με τους Όρους της Υπηρεσίας" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "Πρέπει να συμφωνείται με τους όρους για να εγγραφείτε" + +#: forms.py:124 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Η συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη. " +"Παρακαλώ δώστε κάποια άλλη." + +#: forms.py:149 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Η εγγραφή μέσω δωρεάν διευθύνσεων ηλεκτρονικού ταχυδρομείου απαγορεύεται. ""Παρακαλώ δώστε κάποια άλλη." + +#: models.py:188 +msgid "user" +msgstr "χρήστης" + +#: models.py:189 +msgid "activation key" +msgstr "κλειδί ενεργοποίησης" + +#: models.py:194 +msgid "registration profile" +msgstr "προφίλ εγγραφής" + +#: models.py:195 +msgid "registration profiles" +msgstr "προφίλ εγγραφών" diff --git a/registration/locale/en/LC_MESSAGES/django.mo b/registration/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..87b6226b0474fd7c3200c643a899749a0a765975 GIT binary patch literal 367 zcmYL^K~KUk7=|%=+R?Lz9=z#?9gzeo5-KaW*llDC61`QZa|YX`D@K2af6w3Ix5UVs zJZY0Y{rdLj^yIsPIYQ2mbL1GgMA{6HJ{}HnZJqxtoPE<95Ahb(+BKCmj4b%{fzJh5 zi+mYpX^`vMIuA)xR$I8+mkkt_kzkP(Fm+mayabW*nvou*LkKB^JrZ6s+|xd#C_=73 zs&@FF_b7M{Nd^%o_Zds#i>E9VfmDr$!YR}2l(&wN*-A>1@Rm@;;@Y*gf+JP_|yRA&g$l$s1LFX3&>0-11 literal 0 HcmV?d00001 diff --git a/registration/locale/en/LC_MESSAGES/django.po b/registration/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..e357a4ce --- /dev/null +++ b/registration/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-12 14:09-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "" + +#: forms.py:35 +msgid "username" +msgstr "" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "" + +#: forms.py:39 +msgid "Email address" +msgstr "" + +#: forms.py:41 +msgid "Password" +msgstr "" + +#: forms.py:43 +msgid "Password (again)" +msgstr "" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "" + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "" + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" + +#: models.py:165 +msgid "user" +msgstr "" + +#: models.py:166 +msgid "activation key" +msgstr "" + +#: models.py:171 +msgid "registration profile" +msgstr "" + +#: models.py:172 +msgid "registration profiles" +msgstr "" diff --git a/registration/locale/es/LC_MESSAGES/django.mo b/registration/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3872adf0a0eed30b1ec9fa6410addb3c6db915cf GIT binary patch literal 1909 zcmb7^zmFU>6vqt&0tegqGU+h77t!JFWZ;78!eM}>GBybfLfzX4wZe+4(dzrkn0R~{4M6!<#$ zB)A1eU+;l0fCu1F{1NXF zZN>rf0-<&z#=jiVCZrGuv(uvoK7}cEXe=j8j%7j8V3v-Vf~7EK%GuSP?1-+in`p)2 zfJ^OzlR;ZUt=FccQQXh9)D_91aO^#M(w-V;$NEqQE>haBSb8SkHcd4pNrfJb*s%%g z2UC%cadORAG$pGT-jsCo$^X|JjyNN0UbPhDEjITIsj;;PPa2C$yHs3TobaTiA!`t` zvL;CQuQ&vD{ydqsKE$HatThFe%Hs0k6WdbV`min}&Ok`0>N)}09q$X%26{tmA7gB! z_n%o;5KA?tplcRV1wEN7ev7AKO&zh^e{VtOWQjmG#N5*&RY=B2SNyLZy@(2Rk0_Ja zclL-?NOp?kIT=Udyi}TgUrigedJ~Xp}9`9s}A!5A?)` zjMAC?Tv$T=D{c^ZWl<5cpIogCRs{;6Ycg%cuv*lKvnY6UC17ILI95u}?wYt8<>uHD zSICvax2QuI(~So5VfOv90SlY%TSp@~!4q|Wd?~0c$)b-}Y^Gv&_4U78Oy$D7*W3l> zWg*c?OBWCIF!X`R*!s|MwBPzxIt@vdHmzzKiGYvI!I`op$6&44g--L+onDLMp8V`? zWvOYoVAFLf8+Nf(os6A2`=w@wqf;td+#Ekohw{jJk>dt<`Lspr$COB%S<6Wyq0qAC zUEtLd+90B$RT_sR)!Nsxa}Ad~yMr}kp$UI3R26?;aoc$xcli?!r1HK@iuil8Ftxg- fb6wV8cSAJn(9_ZKB1F6RggdQ%T*xFI&|UlkAoEAZ literal 0 HcmV?d00001 diff --git a/registration/locale/es/LC_MESSAGES/django.po b/registration/locale/es/LC_MESSAGES/django.po new file mode 100644 index 00000000..ba0384fe --- /dev/null +++ b/registration/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,85 @@ +# Spanish translation for django-registration. +# Copyright (C) 2007, James Bennet +# This file is distributed under the same license as the registration package. +# Ernesto Rico Schmidt , 2008. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.3 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-03-11 00:19-0400\n" +"PO-Revision-Date: 2008-03-11 00:19-0400\n" +"Last-Translator: Ernesto Rico Schmidt \n" +"Language-Team: Español \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "nombre de usuario" + +#: forms.py:41 +msgid "email address" +msgstr "dirección de coreo electrónico" + +#: forms.py:43 +msgid "password" +msgstr "contraseña" + +#: forms.py:45 +msgid "password (again)" +msgstr "contraseña (otra vez)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Los nombres de usuarios sólo pueden contener letras, números y guiones bajos" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Este nombre de usuario ya está ocupado. Por favor escoge otro" + +#: forms.py:71 +msgid "You must type the same password each time" +msgstr "Tienes que introducir la misma contraseña cada vez" + +#: forms.py:100 +msgid "I have read and agree to the Terms of Service" +msgstr "He leído y acepto los términos de servicio" + +#: forms.py:109 +msgid "You must agree to the terms to register" +msgstr "Tienes que aceptar los términos para registrarte" + +#: forms.py:128 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"La dirección de correo electrónico ya está siendo usada. Por favor" +"proporciona otra dirección." + +#: forms.py:153 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"El registro usando una dirección de correo electrónico gratis está prohibido." +"Por favor proporciona otra dirección." + +#: models.py:188 +msgid "user" +msgstr "usuario" + +#: models.py:189 +msgid "activation key" +msgstr "clave de activación" + +#: models.py:194 +msgid "registration profile" +msgstr "perfil de registro" + +#: models.py:195 +msgid "registration profiles" +msgstr "perfiles de registro" diff --git a/registration/locale/es_AR/LC_MESSAGES/django.mo b/registration/locale/es_AR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ce8b4e56c8250021193dd307b05b803d3fbba025 GIT binary patch literal 1849 zcmb7^&2Jk;7{&)E6wFttKp=s{dus!%aX^K{O{18^ZLQi#&=%4NF8bRH{P9j=ACEW*AFgV_)4H% zLVpeYYxI}H_z^tN?t>9H13v=41vkNqj|%Y~xCdSbzXY#3R>7aZ9{4A?2HtpL zzW--n(EqOHFW}So{X6&y_yD{N{#Ac(T*R61`*l2C0Iz`9zG@->N8%jtXlgYF~LynzWsLqYE6<1pDVc@vW~9QN{IGIZVztcqw33(iSRV_;6Jrpb)CPyPO|e_Aa1={TMkD6f zXfLsU#@@4aZ;>wZeGDqkN}XUB8ysHTH6`Vx^Jk638W;&zZDk&g zAw8lE>A6ksv|8^+t>tKOnHHDZ@3x}WwN?ugqajaK5U=Om?RJLIU@O|_(Cw}Ep!ep7 zTbtcRUpgO+tkf=(-q<$X-0k;ivoq+@N_Wud_18KZ8^i9-&MKzrw3I1FBbIra`kl>N zyCLM2et#`fO=Hv5#-KOoo*Zhi*=nrgUXh2<2)EEC&-eY?MF#(_Q#_H@vA?l9x*08< z%nPv~ccZS3O@jPy(-M-rA#O8r%_1!R);_8YC)-qqpGe_++wMaJrF+p=BTm~i3B#5#&U`$T)&pt9gPPzbxnGihtQH{sFN^CdB{% literal 0 HcmV?d00001 diff --git a/registration/locale/es_AR/LC_MESSAGES/django.po b/registration/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 00000000..fb746b5b --- /dev/null +++ b/registration/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,83 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2008 Leonardo Manuel Rocha +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "nombre de usuario" + +#: forms.py:41 +msgid "email address" +msgstr "dirección de e-mail" + +#: forms.py:43 +msgid "password" +msgstr "contraseña" + +#: forms.py:45 +msgid "password (again)" +msgstr "contraseña (nuevamente)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "El nombre de usuario solo puede contener letras, números y guiones bajos" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Ese nombre de usuario ya está asignado. Por favor elija otro." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "Debe tipear la misma contraseña cada vez" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "He leído y estoy de acuerdo con las Condiciones de Servicio" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "Debe estar de acuerdo con las Condiciones para poder registrarse" + +#: forms.py:124 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Esa dirección de e-mail ya está en uso. Por favor provea otra " +"dirección." + +#: forms.py:149 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "La registración con un e-mail gratuito está prohibida. Por favor " +"de una dirección de e-mail diferente." + +#: models.py:188 +msgid "user" +msgstr "usuario" + +#: models.py:189 +msgid "activation key" +msgstr "clave de activación" + +#: models.py:194 +msgid "registration profile" +msgstr "perfil de registro" + +#: models.py:195 +msgid "registration profiles" +msgstr "perfiles de registro" diff --git a/registration/locale/fa/LC_MESSAGES/django.mo b/registration/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0d23b432356c5e0f64ec16f124a4652bc3ae45d2 GIT binary patch literal 2175 zcmb7DO>Y}j6n#Kx!F-AjAyF1LVnJIvW=sSm(}GAtkSxV*fz^M^&LsFtFV8?=g@Fte{4_&e4+_4?URl8v1ne*n&x%b?A?(;t{ zocdnidLH*{xPQd`3a=l*1J?@B0ycp+fGyxv;F(8-co(<;yafCf_y+KA;CbLZ;IqK9 zj|uS%@B;7&-~^DhrhqR2^T3yZW#B2`mq6yN0{?*4H$WHf*~f+W0=NU@Ixd_Rq6GXJ z$lvb)9pJ(lA;y8<0Xgqqz_Y+Ekn8yu_$u%;L>R|_uLCawQ^3!FF9Mf_s}1+6#PYM4n%!67y9}dR3CH8>%Q$5qS~S!=U0VdRn<@nyV@q zDT*5PdbLTCT(4A8q4M=;U|JL^h#X1AsbrPQYm&#B>i?!gNa)L&I+;n!CFLI{DprC3 zWLfWe-A&c5u?m51snqtHqG2kCB=$tI0 z(DS0F)E^awQSz$lft!(Fhmr@|B<8~4rYdSH>skwF3zK%py(#^2V2$Lo(-Wz@st2LA za#7iHtt*XkWEBF3Qghb|)--0u$He+bYUR+|w*8)EPgr&fw8zKo)U1rORS2aYRizF>hjKwBQaQ)i@%6N6ZjvbKC$Kk<$Bs06y(qx`z!t7r|F>K>#*ri zHa~UsB4y`ir*he8%FoPQzcP!(wU39~c{E;B)4duT>J=g4^>~BKzS%Xc?v^~1}_I{&`8u- z16_5X-7o$p(?Kvwzpp`%P<3xNP3Y!;nFz!Ta%k8_RQ jcg$V9q2iP0j|KQhVahnxYsA*^a7Q>pg9pwJcTnSh%x#Mv literal 0 HcmV?d00001 diff --git a/registration/locale/fa/LC_MESSAGES/django.po b/registration/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 00000000..5c658cda --- /dev/null +++ b/registration/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Mohsen Mansouryar , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2011-11-18 01:11+0330\n" +"Last-Translator: Mohsen Mansouryar \n" +"Language-Team: erixe \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Persian\n" +"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: forms.py:38 +msgid "username" +msgstr "نام کاربری" + +#: forms.py:41 +msgid "email address" +msgstr "پست الکترونیکی" + +#: forms.py:43 +msgid "password" +msgstr "گذرواژه" + +#: forms.py:45 +msgid "password (again)" +msgstr "گذرواژه(تکرار)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "نام های کاربری تنها می توانند شامل حرف، رقم و یا _ باشند." + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "این نام کاربری گرفته شده است. لطفا نام دیگری انتخاب کنید." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "دو گذرواژه باید مطابق باشند!" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "من شرایط استفاده از این سرویس را مطالعه کرده و می پذیرم." + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "شما باید شرایط عضویت را بپذیرید!" + +#: forms.py:124 +msgid "This email address is already in use. Please supply a different email address." +msgstr "این آدرس استفاده شده است. لطفا آدرس دیگری ارائه دهید." + +#: forms.py:149 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "ثبت نام با استفاده از پست های الکترونیکی رایگان امکان پذیر نمی باشد." + +#: models.py:188 +msgid "user" +msgstr "کاربر" + +#: models.py:189 +msgid "activation key" +msgstr "کد فعالسازی" + +#: models.py:194 +msgid "registration profile" +msgstr "مشخصات ثبت نام" + +#: models.py:195 +msgid "registration profiles" +msgstr "پروفایل های ثبت نام" + diff --git a/registration/locale/fr/LC_MESSAGES/django.mo b/registration/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..8bff4d9a2e83a6ceb3206f3d8ee2d6f3b7f79b1a GIT binary patch literal 2012 zcmb7^&u<$=6vqcBzs#>vfhr`B-UZx1`~!RmdGy6g~IB7r@^@$f@QM zJMlRga*xTtHU-I5%w$cp%7C0l<9W=)mkflb8jzzJcqFzmBnGd@WQ|JCj*d+jP#EY? zz2-V&(y3#eoD!cHAAC!##lZ}9;A)3g8<{pK=_GONz1pII9x{mq=^RhrF;lQOlc~!t z^JIH;i`~$~tai2c$JQl}CUiyjwaMqy9!H+VzIJA8PArZ*{^>)9(?QlsZ}L9%#7Fh_ zL`nKtSfP7@Dg8Bxan%PFjfIxU&9(g%ud9uNnzImD(M0y{rXd6^wzQU$im6HH@^ zsJGNUQYX1mw{2M;FcWuJBko9ot76AaO@;L?pQ?KOET)KB&!qg=MX#hv)ULBf9EWHt zi4LFwndne*r1QRwW{zsNmJpL-prb`<>~UdTh<1G6B+-Xu-$z~Bp~mjbZnTbik$grU zp{_b~wY}Jm+V4m0MOu8XbM4x@?W^rJHb#3qG~(^?``Y!sZS6zUbvpN{4%T&OR|jX} zyL3xu9yPO^>66%ItEn!m58TQ*tTeVEzSMn=x~#JfZNhx~y+%@&du}x~E$jL#jh(HX zjq?jHw%Uz#6Ff)WYs54Z73~? z1G*^YB8*3s6*MPCqV4J9@hBgUoR-6q=Kh%g{H1nmpoFU?;F%Y?GK7WcnYhZ>oZ85T z)-a9lL2Nl>T~B^K(XmpM0%pc86*)z5G@j~c;82s24hFpi=2 zP&C~@)|2K`J*Wd)%1ws2be&7wSdxabC%HT~K>nye70^(u>VP{|af$+%$wuAjSer_U Nsuv}1)2q{B{sG{xSPTFF literal 0 HcmV?d00001 diff --git a/registration/locale/fr/LC_MESSAGES/django.po b/registration/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..f25ed06d --- /dev/null +++ b/registration/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# django-registration French translation. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the django-registration package. +# Samuel Adam , 2007. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8 alpha-1 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-07-01 14:33+0200\n" +"PO-Revision-Date: 2010-07-01 14:30+0200\n" +"Last-Translator: Patrick Samson \n" +"Language-Team: Français \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .\admin.py:23 +msgid "Activate users" +msgstr "Active les utilisateurs" + +#: .\admin.py:43 +msgid "Re-send activation emails" +msgstr "Envoie à nouveau les courriels d'activation" + +#: .\forms.py:35 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: .\forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Cette valeur ne doit contenir que des lettres, chiffres et tirets bas." + +#: .\forms.py:39 +msgid "Email address" +msgstr "Adresse courriel" + +#: .\forms.py:41 +msgid "Password" +msgstr "Mot de passe" + +#: .\forms.py:43 +msgid "Password (again)" +msgstr "Mot de passe (vérification)" + +#: .\forms.py:55 +msgid "A user with that username already exists." +msgstr "Un utilisateur avec ce nom existe déjà." + +#: .\forms.py:67 +msgid "The two password fields didn't match." +msgstr "Les deux mots de passe ne correspondent pas." + +#: .\forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "J'ai lu et accepté les Conditions Générales d'Utilisation" + +#: .\forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Vous devez accepter les conditions d'utilisation pour vous inscrire" + +#: .\forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Cette adresse courriel est déjà utilisée. Veuillez en indiquer une autre." + +#: .\forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"L'inscription avec adresse courriel de compte gratuit est interdite. " +"Veuillez en indiquer une autre." + +#: .\models.py:165 +msgid "user" +msgstr "utilisateur" + +#: .\models.py:166 +msgid "activation key" +msgstr "clé d'activation" + +#: .\models.py:171 +msgid "registration profile" +msgstr "profil d'inscription" + +#: .\models.py:172 +msgid "registration profiles" +msgstr "profils d'inscription" diff --git a/registration/locale/he/LC_MESSAGES/django.mo b/registration/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..be936503238a6df8192233f1fe242e7e60d41895 GIT binary patch literal 1896 zcmb7C&u<$=6ds@uFh9i)Ayf|UMpL@R2?7Nd5KxMUs38h&MGqC4>^`rT*t^!uIIRy{ zxFRG+wEM2 z%$G5Tm@mru0sJs-00UqL_$BZF_$hGdL8aaVUICs5eg}L7_#1E;_!sag;OU2ydJ=dR z_$Y7 z1HOfA5BMDLci>CFd%yzl@9Fu{(xlGQK)HV%DEAfM)4(r)2%ith{|QXVPwtL})baRq z16qYt^C9^k4bUh^p^#>-hs1acQ>{~7?=TtG5$O~&Hq7KQa&@LEo2I3#MxV3UNkUee z94FQp?UF2|woTHQYGTh#ois>Ckzs4uQevrPvU;+WIF5?6(O_+vY`fKJbVyT_)M{)v zb&HNgRjtEwflR1$L(=O|A~E^@(!s@~y2Aryg*v4y zMb2TCI*s@Zc8-lbM`^pcg+;DeJB_dmGZe3`W^HP=ty>flJ`fVBnp{9OGdtI5L2rm{ zCC8Sw_IhR_Vjb4WB~4a3bji*{@ony?1$ESs{qcg%=opDEt4XA3tI&*E(%=&htrCUu zpU9*(O!gIrE?AF(D<}({E>F{*kQFw$l^GXQY@9^F2kqDf)vQc~jnAsV1vEF-e^p z3BBFK?!D%=&1$X~X2qoOZsC$n0{n9e7#UvuUwp!vQjJ+E})xueL)r4 zm&x%B_gbp~)y`8`*T%AY=W_L7t=6{@aoI7hNrFkfj{(JKlTIiec$tU z{Vl&Y*$x4BaEF_oANc{!`+lUbImBj!&293#{%8L^4#p%-*kW-LS6zQd_zl7TBd+^k z0?!XHxdWbom~|1X?+=S4Q3$4Y{k}gSBrwK#&eVkmxQlB3ur~|PyFbJjBz;izglPA_ z>E{wXiZha;dPs4EEby1Ia>D!Qc99#>mpb5#6i2y0C~VGofF$}TZ6LHm5Z}UbNGJ-0 zc5x-5;eU?u>P09J^r2cGU+y&qy$AvU{cQ!gh3%&an{;bReR8kRr-|i3?sijx=F&@K zNF)s(VD8CgALP=TJkB1r2rVXZj@;Eu_kT53%~, 2008. +# , fuzzy +# <>, 2008. +# +# +msgid "" +msgstr "" +"Project-Id-Version: registration\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-10 02:01+0200\n" +"PO-Revision-Date: 2008-02-10 02:05+0200\n" +"Last-Translator: Meir Kriheli \n" +"Language-Team: Hebrew\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit" + +#: forms.py:38 +msgid "username" +msgstr "שם משתמש" + +#: forms.py:41 +msgid "email address" +msgstr "דואר אלקטרוני" + +#: forms.py:43 +msgid "password" +msgstr "סיסמה" + +#: forms.py:45 +msgid "password (again)" +msgstr "סיסמה (שוב)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "שמות משתמש יכולים להכיל רק אותיות, ספרות וקווים תחתונים" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "שם המשתמש תפוס כבר. נא לבחור אחר." + +#: forms.py:64 +msgid "You must type the same password each time" +msgstr "יש להקליד את אותה הסיסמה פעמיים" + +#: forms.py:93 +msgid "I have read and agree to the Terms of Service" +msgstr "קראתי והסכמתי לתנאי השימוש" + +#: forms.py:102 +msgid "You must agree to the terms to register" +msgstr "עליך להסכים לתנאי השימוש" + +#: forms.py:121 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"כתובת הדואר האלקטרוני תפוסה כבר. נא לספק כתובת דואר אחרת." + +#: forms.py:146 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"הרישום בעזרת תיבת דואר אלקטרוני חינמית אסור. נא לספק כתובת אחרת." + +#: models.py:188 +msgid "user" +msgstr "משתמש" + +#: models.py:189 +msgid "activation key" +msgstr "מפתח הפעלה" + +#: models.py:194 +msgid "registration profile" +msgstr "פרופיל רישום" + +#: models.py:195 +msgid "registration profiles" +msgstr "פרופילי רישום" + diff --git a/registration/locale/hr/LC_MESSAGES/django.mo b/registration/locale/hr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..bf2a06dc416b8ca7c8d7836f91c3810cc0e027dd GIT binary patch literal 1939 zcmb7^&u<$=6vqcBzs&FQLqY=aK!P@+>o`>^C2lDVA%}>VSiw}l1wDJ8*JJO_STnPm zrdJM}a)f&ihzk;MtwbcGvvXTd+fXTZO~1pEhl0(|FTrJe^D!B@c>;FsVR;M?F` z@MG{#@H)8oh*B3o1IB&71z!Tc178O3g6F{Bz_|bK;HSuS4}25U=NHsZiCN( zUxARLo&PdDM+5T7#ka8%-fR~MekyRJ(C6*s)inO#M)=%;4t}XxDevp38#A`x3mwwuGV@%R~%%r!mEvfbxxe7PP|u}G~h}oMi3kH%!yF2 z*i)z@uJC00^oh7i_e8bX`(5kO`G78R#@Z~X9Z9^z_-Qh24M|MoF_S@u;}D;fUYm^i zF~?+jrb9ewPh)2Xx~qevb!z9rUdWf@alS`PsqXj1i3z6z>#75xVb{|5zBcM>$y1Mj z)LaNuaOe%24ZswL7cxtrYyP`OpGl} zieb;f^}71pmeaUXb|VOO!+STeOq@F5=1BI`^!a@&VOC$~a^^#?VsT7t}4} z8b`>DEEY|@XN&7tZnBayNjky>^t3ix8^`jO>W$huTt`JDoxL%{1-TU#$2pGSD)k2J zyoC44&`(y5*TvkZqGZGLY>G;3(hAD0_F2-llIoDmQZ{MbS-d!#@wX?m} z*<7os?aI=~I_-@<+#gxexO|lyeobTRgB@yIy%DaSc08P|8_E3sp%6G8%;CNcY{_#$ zn&8aQffN)gpUO%PCFp{w!~tT1j0)@H;r(#5egwla1>wWkB*KDv_+HE~SMJw5az zJuUqCO~gZ{EFB_;OoataUGeY^gXtwf`QSv!Kmnz8Tprzl(_E*P&2?cZ h;+fB*d{`dtpENqUKfS4EKh^4^X$6gDgIOu5{{RFkI@$mL literal 0 HcmV?d00001 diff --git a/registration/locale/hr/LC_MESSAGES/django.po b/registration/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 00000000..1ed7e6c2 --- /dev/null +++ b/registration/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,86 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.8.1beta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-12-01 14:09-0500\n" +"PO-Revision-Date: 2010-12-01 15:49+0100\n" +"Last-Translator: Enis Afgan \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Croatian\n" +"X-Poedit-Country: CROATIA\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Aktiviraj korisnike" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Ponovno pošlji aktivacijski email" + +#: forms.py:35 +msgid "username" +msgstr "Korisničko ime" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Ova vrijednost mora sadržavati samo slova, brojeve i podvlake." + +#: forms.py:39 +msgid "Email address" +msgstr "Email adresa" + +#: forms.py:41 +msgid "Password" +msgstr "Lozinka" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Lozinka (ponovno)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Ovo korisničko ime već postoji." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Oba polja za lozinku nisu ista." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Pročitao sam i slažem se s uvijetima uporabe." + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Morate se složiti sa uvijetima uporabe prije registracije." + +#: forms.py:95 +msgid "This email address is already in use. Please supply a different email address." +msgstr "Ova email adresa je već korištena. Molimo da koristite drugu email adresu." + +#: forms.py:122 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "Registracija gdje se koristi besplati email servis nije dopuštena. Molimo da koristite drugu email adresu." + +#: models.py:165 +msgid "user" +msgstr "Korisnik" + +#: models.py:166 +msgid "activation key" +msgstr "Aktivacijski ključ" + +#: models.py:171 +msgid "registration profile" +msgstr "Registracijski profil" + +#: models.py:172 +msgid "registration profiles" +msgstr "Registracijski profili" \ No newline at end of file diff --git a/registration/locale/is/LC_MESSAGES/django.mo b/registration/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..bccb71f63a9f5c116e21763deb0bd560da518ba5 GIT binary patch literal 1476 zcmb7@&yN&E6vs2W<_Fy*35q(O+uT6>*k1@m@S> zPmQyszM+F;U0SPzy^tR_O*JK^Oy{{cG2vifR}D)<9!M5baTUv(l8$@I%cet!GhEBF znF5c*JWZ6A)}lN%7EQaZ`qqxA9{WIH+F%wKgpctJdwl0lYiit{*yKCN9^x_ar# zGHoueZw#(q>#R#-T}W1ap|j-jxbVr)_NlXWeV8m^j`8S{&pAk+7J9vNNpC(`SfKfZ z{wL=??#=gla7@-^qGR&^^;=;dlA&YcD-PE6>GD>4&l$SvAQ5f6heSTTv1OeZIeoE+ z3hAb{{;adYrWkV}$xyiN(;$@!%F}6Qb+Ed;-`9M%*IBYAKqko$2hpb>KZG+)g%O^o zv}ETcT=;tUMY6c>7t4XPl4XTQVt7ImOzmBqZUZG633+?Z6kXaxhg?@uU@h~}-$BNC7`r(&Yr$a3>>AhJ&D%Q&e9lXDDvl9n{DiX> F)PM38!N~vs literal 0 HcmV?d00001 diff --git a/registration/locale/is/LC_MESSAGES/django.po b/registration/locale/is/LC_MESSAGES/django.po new file mode 100644 index 00000000..479e792a --- /dev/null +++ b/registration/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,74 @@ +# Icelandic translation of django-registration +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the django-registration +# package. +# Björn Kristinsson , 2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-01-22 12:49+0100\n" +"PO-Revision-Date: 2009-01-22 12:49+0100\n" +"Last-Translator: Björn Kristinsson \n" +"Language-Team: Icelandic\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:36 +msgid "username" +msgstr "notandanafn" + +#: forms.py:39 +msgid "email address" +msgstr "netfang" + +#: forms.py:41 +msgid "password" +msgstr "lykilorð" + +#: forms.py:43 +msgid "password (again)" +msgstr "lykilorð (aftur)" + +#: forms.py:55 +msgid "This username is already taken. Please choose another." +msgstr "Þetta notendanafn er þegar á skrá. Vinsamlega reyndu annað." + +#: forms.py:67 +msgid "You must type the same password each time" +msgstr "Lykilorðin verða að vera eins " + +#: forms.py:90 +msgid "I have read and agree to the Terms of Service" +msgstr "Ég hef lesið og samþykki skilmálana" + +#: forms.py:107 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Þetta netfang er þegar á skrá. Vinsamlegast notaðu annað netfang." + +#: forms.py:133 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "Óheimilt er að nota ókeypis netföng. Vinsamlegast notaðu annað netfang." + +#: models.py:218 +msgid "user" +msgstr "notandi" + +#: models.py:219 +msgid "activation key" +msgstr "einkennislykill" + +#: models.py:224 +msgid "registration profile" +msgstr "skráningarprófíll" + +#: models.py:225 +msgid "registration profiles" +msgstr "skráningarprófílar" diff --git a/registration/locale/it/LC_MESSAGES/django.mo b/registration/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0134d244fbce3c8505e849c2a072c95f76180b36 GIT binary patch literal 2029 zcmb7^OK&7K5XTKHui+g)0`X9-1Z*O3Pfs?2X!0N-n@CwD%MfM}%LSZnPmh-#yJfp4 zn|ur;uE3E4TJhKuM{?!@Cxo=(#DP!1k-xipW;QDhV9E2d+b+BOud2B{ckXkBHi!Nq z`Zwq=p|9S9AGB}51@JrYaqxHWG4L;tgMWh$fv?@m*ppxzd>-5YKL$SnUj=^zuYiAm z>tOr7+D?NPFh2sr`Co$1fH%Qs!Bg-Y_#5~G?z#=0$NaPVYd>y*PhkEN_%`?p82p)g zfU&2+7r^kIHuwp+555B41TTZXf?MFr4>I-$cnG#Z4Tk%_0G|VIHT)Tb3HuX-JC#k) z?osqf3-6dTY-4b_(ky%n8ifWor|n^ko@!>0r)uGj7J7I~XhDPUPPR#4bGI* zmv-dH4CsAn$10JmC!9MnHk}S=USvY)1$H30lfk~eOc_lwT;#Bl!4E5Z_*OclGa7_D zs^y6v(vfmhSTj_I%F8sOUM_``a- zPBBajRFBwIgf7I2T{C5Uz!}|P4c!q0TWKdPyF=DbIy)JZS_?e^PXc?LmL%}<(16dgB`M%3k%HJt7$NQ#Bt=_wRzJ+uN z;pCT)R$W?*J28*n;&F#MOWlhXUym2#7#sP49IJ5IY+r}R%RFA9&SG~7<2SKyPdLx} zR%n+CZ)}%#axqqhwn{7WT+r&Enny`J-^fB*MTr@$!&GOb$RzJeG3wH;7r7GJ(5mtq zxr&U<)?53#``fceccQqpg;*hvc>lP7^IqQY?IK6;Rwx+?>!e@1+TY>Jvwgug#^v_9lLBU9!1#N(;6v!yLl zYHyFR(%;;>)?)9K(jf)3K}navVM(W7Q>IS8Last76t)kAT`wx8bgHa6IWcvbvr8%& zDq#%@fl%VMN=qzO^8!gT7FOaTL620OAWSMORi%#Ew8W@-zb8WjqzJs(JI@?rV-h!J~euC{MqyDqd>*Bat(?X=+|p zH4pb8voqeCTxpaFGB;vZW`Sfqgkw^8C`UR}&SYAUxHB#gt%(Z@k;K3BT{72&Uj=w_ QSgn7(P=)jCLY+tKA1=>W7ytkO literal 0 HcmV?d00001 diff --git a/registration/locale/it/LC_MESSAGES/django.po b/registration/locale/it/LC_MESSAGES/django.po new file mode 100644 index 00000000..09a3c814 --- /dev/null +++ b/registration/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# translation of django.po to Italian +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Nicola Larosa , 2008. +# Flavio Curella , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8 alpha-1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-07-01 14:33+0200\n" +"PO-Revision-Date: 2011-08-04 12:41-0600\n" +"Last-Translator: Flavio Curella \n" +"Language-Team: Italiano \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Italian\n" +"X-Poedit-Country: ITALY\n" + +#: .\admin.py:23 +msgid "Activate users" +msgstr "Attiva utenti" + +#: .\admin.py:43 +msgid "Re-send activation emails" +msgstr "Re-invia email di attivazione" + +#: .\forms.py:35 +msgid "Username" +msgstr "Nome utente" + +#: .\forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Questo valore può contenere solo lettere, numeri e sottolineature." + +#: .\forms.py:39 +msgid "Email address" +msgstr "indirizzo email" + +#: .\forms.py:41 +msgid "Password" +msgstr "Password" + +#: .\forms.py:43 +msgid "Password (again)" +msgstr "Password (di nuovo)" + +#: .\forms.py:55 +msgid "A user with that username already exists." +msgstr "Questo nome utente è già usato." + +#: .\forms.py:67 +msgid "The two password fields didn't match." +msgstr "Le password inserite non coincidono." + +#: .\forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Dichiaro di aver letto e di approvare le Condizioni di Servizio" + +#: .\forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Per registrarsi bisogna approvare le condizioni" + +#: .\forms.py:95 +msgid "This email address is already in use. Please supply a different email address." +msgstr "Questo indirizzo email è già in uso. Inserisci un altro indirizzo email." + +#: .\forms.py:122 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "La registrazione con indirizzi email gratis non è permessa. Inserisci un altro indirizzo email." + +#: .\models.py:165 +msgid "user" +msgstr "utente" + +#: .\models.py:166 +msgid "activation key" +msgstr "chiave di attivazione" + +#: .\models.py:171 +msgid "registration profile" +msgstr "profilo di registrazione" + +#: .\models.py:172 +msgid "registration profiles" +msgstr "profili di registrazione" + diff --git a/registration/locale/ja/LC_MESSAGES/django.mo b/registration/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..e0332b0e7cce033c22f9b774b117cf5d78e6becd GIT binary patch literal 2035 zcmbu8%WoS+9LEPJl$!Do0)YgF;Y0(hS+_hAH&lg^Ng zr0i}=X&!2uCWHV|X@I08O+zW~0y!WdapjD-O#I-;f53OPb{s=fff#B0*`578zrXSC z_ivjaSodK+iv0ohL+be!{9p}(8dw5f0~f(p!R@ya@*H>++zU>EkAuH}ZQ!5aJ>Vm^ z5pp;91b8Rd4ys%)f)9ZG;DewEZUf&0m0bWHM6PjA<@psK$G{!86H)}H!3-F?gOC*X zI@ksN40eJ$w-fRh*bS=qgW$cO4?YZ@t#hf)pTHeB{|(#;RzReWma1Q!srpom#!`LU zRewQRf>NWU>TfKBA&`Qg+(?fYsPd3*nq@G%+A%Bj09(To4)Gp?a;~~y6`(i77OKVq6XFfWO;gT{EcL8BC(Q7yq3end@)BuLhcxUr9_TJ+qR=*S zJyU&D7)Hj*@f#irq7;gLluV@0bq2WMY29hoC;%`H-cu zH0|0oJ)!MM(1f1ctv{)Ez^;c0PfNMX7CGiQZjv6(T6T%iLxY$a?HnE!St0h97$zAv zocKUtA6#s+$V{%KILjyLE3Ck5jxl%k^z6@BamO|H#d^DYyP91l;(F`=291lUr7)Hx z_4u&&bRh>p_fjLvT*18;j-(E1?M*vX6E3sXWgAW!e~2V)$E}YM8GI?j?`3#S2H%$7 z{4fc1WICZ{zRkiMd_oy#_$^R zn3DlIIxhns5+QVb^8RvT;L4!9cA~Zb0}L#X!B{g2jHLgr49}{8hpW*oIEBfVPkd4y zdtcp?n>ec?1NgipgO6l57Zv}t3>RgH`d9EuZg>@N+LG???{rsn{=3@JWE-jX7|zNN X;V}0LGWb}A%Uget4XF{dDLVNJiZWT^ literal 0 HcmV?d00001 diff --git a/registration/locale/ja/LC_MESSAGES/django.po b/registration/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 00000000..afaaf948 --- /dev/null +++ b/registration/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Shinya Okano , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.4 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2008-01-31 10:20+0900\n" +"Last-Translator: Shinya Okano \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "ユーザ名" + +#: forms.py:41 +msgid "email address" +msgstr "メールアドレス" + +#: forms.py:43 +msgid "password" +msgstr "パスワード" + +#: forms.py:45 +msgid "password (again)" +msgstr "パスワード (確認)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "ユーザ名には半角英数とアンダースコアのみが使用できます。" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "このユーザ名は既に使用されています。他のユーザ名を指定してください。" + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "同じパスワードを入力する必要があります。" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "サービス利用規約を読み、同意します。" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "登録するためには規約に同意する必要があります。" + +#: forms.py:124 +msgid "This email address is already in use. Please supply a different email address." +msgstr "このメールアドレスは既に使用されています。他のメールアドレスを指定して下さい。" + +#: forms.py:149 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "自由なメールアドレスを使用した登録は禁止されています。他のメールアドレスを指定してください。" + +#: models.py:188 +msgid "user" +msgstr "ユーザ" + +#: models.py:189 +msgid "activation key" +msgstr "アクティベーションキー" + +#: models.py:194 +msgid "registration profile" +msgstr "登録プロファイル" + +#: models.py:195 +msgid "registration profiles" +msgstr "登録プロファイル" + diff --git a/registration/locale/ko/LC_MESSAGES/django.mo b/registration/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a29c7c3fb6f8ea2e27496d03402814559d11bb77 GIT binary patch literal 1947 zcmb7?%WoS+9LEPJFY_)Bfke^o0!>8LaUzh42~phCgor$>)Tz{7+O2o&EVXyd&N^uh zNFj1VlvpBAyG=?QC2FD)5s5@`MX1vMfCCp!NEH&|;vL_SxbPj@u@k8W7-{x1GduHp ze1E?O$Bz{l#&OIyF}E;JV0Jx%55_jw3hsc--1E#Pp}1i>&aSvec;R3kJf2|PhMMlN7|O2FP7TOY9SDc{FjelVHcAVn6AMvB zaEB&LcZ}RI-K}mdJ;g~+I$SpO6{opCe9Swt6N!gh?tf?D*1Zd$EuglmGU_cdpxZ4p1y`uiXbF31#=cI+|pvgvZePmv_o1t*b7r<0SUlVQf=+~Jmc z^r4?c5vV(1Q@S1-#Z8_x1RfaHNtaT(8yi!%VE>3qIh3Q;)RM;i}q0E)6Srcg47uZe4up%w2n^dcrS=`;Qc@V7qt;S zZYtyTd*{QU5p8f-I}@T$hJ%Cs?_L-l3i}3h;c8Jww?tBRZ6`<&13l3lbuNvQtu$Lv%$-dKr@p5R)P>!~0OgogS?RqR~@13gL8Z##)@-(de>xS3stKj7;{ zQP412bTW;oU4GSVPbX2O4=FaLJA%6(jYdD#PBrhTpwMJm*oxT(8Z}6#(2YJOizV;J zJt}W6$>J2rLRKB*^WNGr$>}Y5Yg4W)l((nIyT0SC6}^Q;d80&fWmeAJ_2y^2`E@_5 zEG>IqFEy`MZEogeai8SveL0h3vT(m#nv%sV$>M!^bGE#@O68yS$eS)H4>uPG24r!u zQrJ8&+Hg*l-1l;BU4EDIt}nC08)}g&TXN-^x4O})e3Dmpx{BCWvvOvQd0Qp#b`D-k z^?&8vtXwU~<$aZ4EvHIhQO>WEoLwY&bEcUWAvtejulZQTfA9nvAhqnCyp=x^lafki zm#gv>_vOz>X;I!$!p=1z^@Ead3P5|dUJWC@&l^Y zMi<*iE`I54p}c!jIPvb}Q0OUdZsV}fwc0dlKq}&Ed0E(3*AHDpnPqmTvXrOF^g62v YL6v+KxmI#HRQsW4jXJW%s@Y}iU&H$5Jpcdz literal 0 HcmV?d00001 diff --git a/registration/locale/ko/LC_MESSAGES/django.po b/registration/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 00000000..d466420d --- /dev/null +++ b/registration/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Young Gyu Park , 2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-12 14:09-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Young Gyu Park \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "활동 사용자" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "이 메일 제 전송" + +#: forms.py:35 +msgid "username" +msgstr "사용자 아이디" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "이 곳에는 숫자, _, 영문 글자만 가능합니다." + +#: forms.py:39 +msgid "Email address" +msgstr "이메일 주소" + +#: forms.py:41 +msgid "Password" +msgstr "사용자 패스워드" + +#: forms.py:43 +msgid "Password (again)" +msgstr "패스워드 (재입력)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "이미 같은 아이디로 사용자가 등록되어 있습니다." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "패스워드가 서로 일치하지 않습니다." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "약관을 읽었고 그 내용에 동의합니다." + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "약관에 동의 하셔야만 합니다." + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "이메일이 이미 사용중입니다. 다른 이메일을 등록해 주세요." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "무료 이메일 계정으로 등록하실 수 없습니다. 다른 이메일을 등록해 주세요" + +#: models.py:165 +msgid "user" +msgstr "사용자" + +#: models.py:166 +msgid "activation key" +msgstr "활성화 키" + +#: models.py:171 +msgid "registration profile" +msgstr "등록 프로파일" + +#: models.py:172 +msgid "registration profiles" +msgstr "등록 프로파일" diff --git a/registration/locale/nb/LC_MESSAGES/django.mo b/registration/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..51b4e995a9d0614c2907de71e2d60c700259c9a2 GIT binary patch literal 1891 zcmb7@&u<$=6vqcBzs&CfLP#JUAZR04#|c6N6QU+fTBUM|l{%I9A<)?Syq@fO#+sRR znm>diLL7QS2rdY5&7C_!syJ}s!j&W6w`-@dR3UYw@y9zmGw-|K_uifJ=e|}L=P_Tw z{2udF%=HKGgYhG{1pWj*4gLW>1^x{t;J@Hw;M)%>^(?pyz6@RhzXCr4-vWOHuY-Sr z8{qOo^*IY(!1EC(_kRn%0R8~J2%doFz~8|w#JU51i09WIR_Yn>b5Qi;;G5tv_$c@d zD0*&#FM&UUUxL4ZZ-B`oN_D|5xCMR(Ho(8YW$+(RJb4Y5JrAyeqUQ>TSLzE8a?}%; zvhPXE`H=6J4{TGATxpaw(If*hPRHZ;_uT9W_EbY+h#v7)hIk;~t2U_&?CHqF5yg>? z)uYv8CS7>e=`ryw6Jltp%|SF%9l6>O)XrF&f^?dC4nghGNKcvM1Zj(zd1i_ZcQW2c}R?CdDynO3iS{o^4z_*i=0TjYp0qGi@|9T%-X9QhOoN zSjWLgcH#bokP>iil@VopUqNwts*93oT!u&kXCr(dXCb!W7}LofYeE@)TgejFIey$r{O!2;4AOgt24Ide5~sAnWu1VXbQgPVo*{gs_We$4`Q;L zCO4r1nP^jbsBPwwg{xZ4wZ=YAoR7&~$V{4Sm03u7u1$^ZC%xn{%0$wbY@?jowAxx} zB`d4R%KNms(thuQcktZ8#$=zTMuPnBzK#wt>3MBKp`-I{I&?NK9Ib6H1>A)cJ6-RO0(6tjKrX5lHTzI ziX-2O%aa0``iKT2?E}Y;4|-RUwY&R75DG2Xu>+T)SlhG)6%Dn`sJuL&lu?Bql~aHz z%GgrhmpPWkoKh;OpDkEDwH(oZIrus!dl8FmZSN+H88fR!hkD@^txr{QGMm+X8 zA~+Xls=DpwT?f*|>=56im(&euIg9qFL*PV^rknR1d+9dOl}W9j0nUadXfk<@?lA>Y z5Sw(9tu0I@LMD^U$hT>0@w;%Y2`{8LrQx7v$ORmR5wqJ0le28W!Nqg9=8SKq^5cGD zinCR)NV$gV+A|qM8My*^=(`-I!sn{(#s~#7>!ypIk)Nj8s`4ahQQK&{liRh~3trRE ldBU4nTOh~CX{OE?Y)^iHX~k)~1=MS(d+=Us=)OAf>OZknB!d6| literal 0 HcmV?d00001 diff --git a/registration/locale/nb/LC_MESSAGES/django.po b/registration/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 00000000..9682d19a --- /dev/null +++ b/registration/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# jonklo , 2010. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: django-registration 0.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-12-15 21:37+0100\n" +"PO-Revision-Date: 2010-12-15 21:37+0100\n" +"Last-Translator: jonklo \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Aktiver brukere" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Send ny aktiveringsmail" + +#: forms.py:35 +msgid "Username" +msgstr "Brukernavn" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Dette feltet kan bare inneholde bokstaver, nummer og understreker." + +#: forms.py:39 +msgid "Email address" +msgstr "E-postadresse" + +#: forms.py:41 +msgid "Password" +msgstr "Passord" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Passord (gjenta)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Det eksisterer allerede en bruker med dette brukernavnet." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "De to passordfeltene er ikke like." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Jeg har lest og godtar betingelsene" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Du må godta betingelsene for å registrere deg" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Denne e-postadressen er allerede i bruk. Vennligst oppgi en annen " +"e-postadresse." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "Registrering med gratis e-postadresse er ikke tillatt. Vennligst " +"oppgi en annen e-postadresse." + +#: models.py:168 +msgid "user" +msgstr "bruker" + +#: models.py:169 +msgid "activation key" +msgstr "aktiveringsnøkkel" + +#: models.py:174 +msgid "registration profile" +msgstr "registrasjonsprofil" + +#: models.py:175 +msgid "registration profiles" +msgstr "registrasjonsprofiler" diff --git a/registration/locale/nl/LC_MESSAGES/django.mo b/registration/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..9e84eb3ed60d06c9e37b1d48fa0edf3b5410f230 GIT binary patch literal 1898 zcmbW1&u<$=6vqcBl$xKaia5aGAr2(aHBJgB+9XxeG>rmINrO{_IH2+F^Lpalnbpj! zT~~qw2QG*sH}3o$9QhA8@h5<|bKpC>c5I^xsf@h-%*?)d^XB{J?eAAF{V330#q%bf zpYXgM`cL5x?I9R}Q}8SBXYd|)`Dr0O0v~|e;1A$C;IH61_!syx_{K9ryac`rJ`Zkz zVXr;#8h8r624>(T@M|#GeG4Yo>wEA9#(&~vAAI{+A?}0UfuDoFfyZFyIU#O?-+}8h91s_1Sm_yn^w4FvR^Oi0$hZ`~)8%zE|p*<}aM%h1nSH z1wyS`h=1PTMnDRIFl)bc4B_Pw4ds~0vP?;8Jeg%CZ^#dsdTa|vW{aF2q<$=O)Ic z#4;I@R|N~1cr|VmAMsSIs3Yd~7adxY83J7w%}%paAsGXe^J6ES2nyAIK_+ox%{eDN zI!dDlI2JM;&%$n;wNAM-)ai?h>h9e;Jli`wpq*~_R<7E{W;a{MN5=OK~e{RH0%j(u(~&BcY0@ zz?g$|ND%5LnpGq2W1Buv4ACkSk@HnQS3GEpQS5A2ZN(jhcT1~7$)LPb6m$ryZ!0x= zLXSAfd?hZEma_OCPXFzqEe@MtYL^9$4rw$X^E?Q#T%|=gC8kuCF^)|5d@+~j_(=5` zWrfrSX$u1lXHr9TlzkBO@%b?Yd!g#4mYo, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: registration\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-08-14 13:25+0200\n" +"PO-Revision-Date: 2008-08-14 13:25+0200\n" +"Last-Translator: Joost Cassee \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: forms.py:38 +msgid "username" +msgstr "gebruikersnaam" + +#: forms.py:41 +msgid "email address" +msgstr "e-mail adres" + +#: forms.py:43 +msgid "password" +msgstr "wachtwoord" + +#: forms.py:45 +msgid "password (again)" +msgstr "wachtwoord (opnieuw)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Gebruikersnamen kunnen alleen letters, nummer en liggende streepjes bevatten." + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Deze gebruikersnaam is reeds in gebruik. Kiest u alstublieft een andere gebruikersnaam." + +#: forms.py:71 +msgid "You must type the same password each time" +msgstr "U moet twee maal hetzelfde wachtwoord typen." + +#: forms.py:100 +msgid "I have read and agree to the Terms of Service" +msgstr "Ik heb de servicevoorwaarden gelezen en ga akkoord." + +#: forms.py:109 +msgid "You must agree to the terms to register" +msgstr "U moet akkoord gaan met de servicevoorwaarden om u te registreren." + +#: forms.py:125 +msgid "This email address is already in use. Please supply a different email address." +msgstr "Dit e-mail adres is reeds in gebruik. Kiest u alstublieft een ander e-mail adres." + +#: forms.py:151 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "U kunt u niet registreren met een gratis e-mail adres. Kiest u alstublieft een ander e-mail adres." + +#: models.py:191 +msgid "user" +msgstr "gebruiker" + +#: models.py:192 +msgid "activation key" +msgstr "activatiecode" + +#: models.py:197 +msgid "registration profile" +msgstr "registratieprofiel" + +#: models.py:198 +msgid "registration profiles" +msgstr "registratieprofielen" diff --git a/registration/locale/pl/LC_MESSAGES/django.mo b/registration/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1f2a228861c28105aae351cdeded9976e68bbd76 GIT binary patch literal 1769 zcmb7^&u=3&6vquLEE|3=AP#VNH@46TN!hY(cByt*id58=s-%nHf}EL`iIW*SvOUet zNN}h?NFWXzIH2Xmf&YM0xits)12}Ty58yxG>q+`cMMzk2J|53|&(Ggy&!1N>eJ{|S zMSlhTNA#D%_#ynE-3KGE1V06T2Dib>4-4@Ycn`b@eha<|{su09e}hkhFFzv0Q{Zdh zf+=_j{0t0s2Vfg(eFKKLzv5+B|1WS2Tz^!E8{ik z!t)*QIWPmC06z!u6JO8gzXPx0`6uvs@E0)H{XU=n1H|%m3;92Z9`bvpo|*lHeFUG- zU@nkq-9rAy?J@?CLLj|bj|O-JU2M=m?lW1I2}zBfT4wTw{D7&;Hg{zD^dZ}Q6|>mo zR5@>@S4LCeluoH1>^YYzBbg+YonuGJ(b$@S>M74jlXfzej>#3{aaNL~MD_b@S^M*j zP0<~|^IWhHN@gLwl2lle|8F?BSS@ot8_CNN>ytq7z!;<_wZW!sQ|!$>9K}+T(a1SA z+DojTvG;7IgX`s z6Jrx%84t*-oP~_N+Mg*t;!>PbM;zOq4CtCnk?4Y$tu!wciqTgY|Ldd^L81CD$Ru{G z8FK8SjU>8 zwN|6{Dz#TTZ?>Y=a;pWyXqWd@2zb`6y%e>VslC*>zWjQt4ZBV0eAKm4yG(jxJM_M^ zJfcrhlSsNX3=hpJJlsyhscXh2UxSlQ3z>4%Wtn$q$7IS4=+@@u?MyX|P1hP*8(ZtA z8)`ROjk~BR&S2C<1v=#UzJFt!LA#q252SVM-`?xK7p&c{ zC{}S?m0nH{I1eQ*GMVGBD3YU?$G#XI{XnS^+lncdl$+^crY2_kAXcy*a=20PP~pl{ zB^A@dGFAm8(&lEuslm0v!766gqDgyrKg3ng7hZ`j>zVQV3WdltM8G=eMC$Ut-6d&R zO=NBDM`ohcNYZJLN@5>gHtD0Xr`T2@iK8!@V*8>~*dkLUC$N)8Uy(1fk)aG<16wXq zT=p$)GgVrSuxpcyEKeU~td$g7_^P-Ht~2S(B)FeQx=6BDl2g#L!a=B|t4)smCS&F5 z1x>h51|K&!JuoyO(<`u2hFc{@SrJz#jV~uME{D1lwZb#e#LQz3x;8dC2*C?tc8AUu UY(5pfo+m{Vp?-7m#6>y9KORXKn*aa+ literal 0 HcmV?d00001 diff --git a/registration/locale/pl/LC_MESSAGES/django.po b/registration/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 00000000..498fd5b6 --- /dev/null +++ b/registration/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,84 @@ +# Polish translation for django-registration. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the django-registration package. +# Jarek Zgoda , 2007. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2007-12-15 12:45+0100\n" +"Last-Translator: Jarek Zgoda \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "nazwa użytkownika" + +#: forms.py:41 +msgid "email address" +msgstr "adres email" + +#: forms.py:43 +msgid "password" +msgstr "hasło" + +#: forms.py:45 +msgid "password (again)" +msgstr "hasło (ponownie)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "" +"Nazwa użytkownika może zawierać tylko litery, cyfry i znaki podkreślenia" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Ta nazwa użytkownika jest już zajęta. Wybierz inną." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "Musisz wpisać to samo hasło w obu polach" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "Przeczytałem regulamin i akceptuję go" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "Musisz zaakceptować regulamin, aby się zarejestrować" + +#: forms.py:124 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Ten adres email jest już używany. Użyj innego adresu email." + +#: forms.py:149 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Nie ma możliwości rejestracji przy użyciu darmowego adresu email. Użyj " +"innego adresu email." + +#: models.py:188 +msgid "user" +msgstr "użytkownik" + +#: models.py:189 +msgid "activation key" +msgstr "klucz aktywacyjny" + +#: models.py:194 +msgid "registration profile" +msgstr "profil rejestracji" + +#: models.py:195 +msgid "registration profiles" +msgstr "profile rejestracji" diff --git a/registration/locale/pt/LC_MESSAGES/django.mo b/registration/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..e23917ce3987d784919cb5ce281dbde02118b4b3 GIT binary patch literal 1895 zcmb7^OOG2x5XTz`FY^v?Kmw^E0Z9bowVeblCPcg07__htYvYZ?LqZ)-+3qmYZFTo} zv-uvJ5f5pF1PBgXa>SnkAw`k6ap266f6dt5SONhp_xyU=RbAEfm^&v=e5No?V!nv^ zE#^y@7w^LZ;|K68_#^lv_$&AX_&b<@e}a#IuimfJ)8GpD0=Nc#0)7a-0^SC9z`Nij zaOHtY&w{7%egMk(pM%eV--FMCQ}6`%3wRl}?tpLN{nUd>JqvyW;-?%Qb+7=%pRYkV z=Q~jD^E0>y-UUyA=N?jO3)~0Sz%RiX_#1cu`~#HpUw&ArXTa4N-vdSNV-W7B$1o*! zk7Le<++#ifJGue|E$$%S+@hDbeLk7ZA4wx_P$X#Se44#t3Iu(IE9hf+xIMT6v zwK`|gnP;6I65li-hPqnsM>ElpONpR5xi%T;H1!;U+N6=5Fo_0fi#hbn6dlfF>aouQ zxdB~eKQVn)T^+)K^XXziXY^1Tdsgjn5?J&rW5!uxF%Xv4rw4Z%D?A+ za3B+C?A^#*H<8mibu-q1DHP*zc1W61GZ?UE8$OjIGb^d?8ED1i~KqkWnc@NV%c|y zdR^@!b&@Offh(#5mf{X=#2rcSW$f6id&2rDAF6797E?rRU^4#O&7h=8RM)#3+>gm- znp}ey$V8jE>l^Q{zuTc}oxQ7@yF0Z#9y=eC?JzWHa=93Wr03dH>+bfF4U~tZFS&v; zYE!GxY$T0yN$U-2Hrf}?zt+HjV6w*(BZnW$HIqg&X`QELtKDi;a$7pYr02B_nU2o4 zX{WG`wzW66=%USqYeOlWdf(-jYFpY43q9nd$2$Kv;qA@s&hZVK^+s(2i9yjMy~8m) zk9;$(j5B2FE$WZ74;Ti>6yF=!|s}lo75d9msZKV5sUl(L~ZFdU`bd%BkI%N0p74$Pg7&nCJpczmeuc z@4;c};(`M`k*D*Pr$?HKeAYZ@!?Ft*_kwo?yqz~*APY;lgRy;+a$Z-RfUi!~bpITm z|7xy03@rz@^q4ISr#xYgxJ$_KDMZ_OEnPRgowLWK@Woqdx<&fbm19i_Jc1?(#gRBl rB0v2Jp&x7H5jm}zO?!ok!KZRLu4DFSKH03qoGN$9#Lah(>qh+rpEN7L literal 0 HcmV?d00001 diff --git a/registration/locale/pt/LC_MESSAGES/django.po b/registration/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 00000000..074bfa02 --- /dev/null +++ b/registration/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 10:54+0000\n" +"PO-Revision-Date: 2011-01-24 12:20+0000\n" +"Last-Translator: Nuno Mariz \n" +"Language-Team: Nuno Mariz \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Ativar utilizadores" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Reenviar emails de ativação" + +#: forms.py:35 +msgid "Username" +msgstr "Utilizador" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Este valor apenas deverá conter letras, números e underscores." + +#: forms.py:39 +msgid "Email address" +msgstr "Email" + +#: forms.py:41 +msgid "Password" +msgstr "Password" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Password (novamente)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Um utilizador com o mesmo nome já se encontra registado." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "As duas passwords não coincidem." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Eu li e concordo com as Condiçoes de Serviço" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Deverá concordar com as condições para se registar" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Este email já se encontra registado. Por favor forneça um email diferente." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "O registo com emails gratuitos é proibido. Por favor forneça um email diferente." + +#: models.py:168 +msgid "user" +msgstr "utilizador" + +#: models.py:169 +msgid "activation key" +msgstr "chave de ativação" + +#: models.py:174 +msgid "registration profile" +msgstr "perfil de registo" + +#: models.py:175 +msgid "registration profiles" +msgstr "perfis de registo" diff --git a/registration/locale/pt_BR/LC_MESSAGES/django.mo b/registration/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..e81b6207be3808b1553a40605d4c5f7ea270a843 GIT binary patch literal 1796 zcmbu9O>Y}T7{>=FZ*HMbKuCzgb0ZO5;}i;wTdJC5Qw)BI96M5xS~T5#yqdFT=>u0aT1jaVx-yMdOXj|{O5W0w{xey5*TMO zU&s6s^Ht0pMqb5J@7B^U2x}dAufZTgKvO8g6rV#;Pc?=Cxmzod<}d7 zTmxSQH^EoH9(W2&!Dm1PUW9K8Ucm2%_)~+wfH%R9o?OIx2yWx|AK*LS`cpz|fVaSx zz%Rga;J4t5;1A37pTQ9SS1`o;bIHF!gssLIJWpeWypE5cQ8-f=*e;M_HG-eR@ibm= zbb++0bJxIUF-4mua>is?rX)3HW|_$w@)M>Z+rp6<(;nNIN>~gyQ_frImC;l>r863b z{ai?ulT1^~&aorqXll(w-BzB{I_>5x9g{1k)BJ!WrD{B8%i5nbtc&3UmM5GAS27Rj z9gqq!`MS z+jyxoD|L$3#NhDahAF8ioj)lgY#=05wUvNukM{Y4DfEWeF620s&V6QVN-UEJc~!8G ziC43Q;&=H#oKQ!s_OHnd`K^mZfaMM04#q0ye_eDU2va?RI%3zFJDm8aoksgO4KBDz zyREH{Ti0XSj|Y40ey=v*sj)ulx=f|f2W94>p=nZWw?B-wa7CdiqHXE9Nf#Q8_oBvT zw6RGWo6WZyQR8BxfsN6CXDT>f?z<7U22r;kZMW#dezV(t^OJrru63mI(a=ima_Nn2 z($1*Up!XnJl}_hcuIk2SS8LsN zH$FPlM!iwn!gZqjq9Md@lIMH=t!WPZE>kj**0FzoG~9_U9qkLbpk$+1CniPNH|Y{; zyC&k2^7;3~p+HaosliJ@##OBYq)a1c2l}g?}#4 zR{zJlHb?}qOIObCTV<&7eGgxX(5y!}GkPSSNHV3jrY?FgtB$?0lT+3bpAM5EryvX4 z&~a9VhMWIXur+u?pjE?(eUr?;LvVb5!y1j+&ta7GmQOwJ$7zcJ!bQN_Y|O`9273hA$lWeWz=Wow$l Qwd(Av#X}L$kqZ^YKLzI-!vFvP literal 0 HcmV?d00001 diff --git a/registration/locale/pt_BR/LC_MESSAGES/django.po b/registration/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 00000000..9e8addb6 --- /dev/null +++ b/registration/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,81 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "usuário" + +#: forms.py:41 +msgid "email address" +msgstr "endereço de email" + +#: forms.py:43 +msgid "password" +msgstr "" + +#: forms.py:45 +msgid "password (again)" +msgstr "senha (novamente)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Nomes de usuário apenas podem conter letras, números, e underscore" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Este nome de usuário já existe. Por favor, escolha outro." + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "Você deve escrever a mesma senha nos dois campos" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "Eu lí e concordo com os Termos de Uso do serviço" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "Você deve concordar com os termos para registrar-se" + +#: forms.py:124 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Este endereço de email já está em uso. Por favor, informe um endereço de email diferente." + +#: forms.py:149 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "Registrar-se com contas de email gratuitos está proibido. Por favor, informe um endereço de email diferente." + +#: models.py:188 +msgid "user" +msgstr "usuário" + +#: models.py:189 +msgid "activation key" +msgstr "chave de ativação" + +#: models.py:194 +msgid "registration profile" +msgstr "profile de registro" + +#: models.py:195 +msgid "registration profiles" +msgstr "profiles de registro" diff --git a/registration/locale/ru/LC_MESSAGES/django.mo b/registration/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1635b4ed687d4d256776033f8b02f48ae394b644 GIT binary patch literal 2470 zcmbtTOK%%h6uv-tnRitr5FieV(nifVPE=58(kLczON5<7iBqW+2u4>gu;k&qN}4q80wlI~mI$e^<`=N!J9q4~iBgG*E8Y3-wAJ9rJt4H!yo1!3U!bYy&O>p9lT{d=B_G&;tGgd;S$B>;rxR zJO?}s+yo8*{{r>`J06SPxxgdXPXXEg67Uf4N8roAUw{XIzXRVvth>Mw><>LI#Brbm zwgbNbehmB#_$=`76A_Ot;0f$Az(0YPfZf32lR{hvE&)B@aU}63@H^l~z+Zu{0pEH$ z;&-x%68H+vF9ShGJcG&Fam?1>JX!48;0h&7luEa~t9po_sG(`-PwdKJY zyugbT)s*yU$_XYYn6Lx0b?u5IyX;H5FirA;qXHEdseIr}+JQ6{N~9~cQzpAm@TF2> zkS6R&N&JFr7qjF`Nr4BSl5*0oDDsLlCjCh#FU5$h)RgBJb{2HhF4>OTCPt;DB)^Y> zIi5?B11a2;z{9r#KC3CmEm4tUnClh~smM`O^}Pw_yc5VmoJPvhR+3b$S}jkLO$Db| zl)iL>-4Ej;2cp50N7W`bDmt=UPdx`M?@1SZBZjl}OS^s{g~(=`@{5kB$uv z55-1h)$;=@t4dD6dcRguR?bUOY-BiR^`kwweAWQkC`nz3#0jf2VRdz4ne6O3mUuUj zfT1-iCmnX)v^$$ljau1ZYam4*3@5XL$IcB8rDGXe1y;_tT~)RN&ri~+@l1w>QrR^1 zq_e5POkZkXU^G28)(ca&RI^Lc%1OJDq)ck)^f*)Q$z=ML*FL;;9?u|HidKgre23dI2V4Y*MYNo1&8b5Y+UHC z^d|NjaJCU%Y&m6zbKyLj=;R5#TV;0FlrmgS_6C&2EDL_5E1g|*aT%)HAp}$4URZiTb zXl%fXIj|V}u#QBZLEwg7#$00w!!LF;VNT|N(*gGt^TlCPWE`z?p+KP?hg7h?2|`;a z*)3DNdOP6}p20OMit3;oxL$=Rw6Fj7>YxFxH9c{>X07kEG-WZ+L{SM=kStu|?uzN0 z9}v0`&OTJURx|F_E^0>PcJ=?|i);)jBQ^IWp+{If^l_BKn$a3^nl|7BOwVoV2I*zc z*yPf*6E{NmIW%411~f%pGrz+{^Mj$KAPd@4=o|Vrcj=xs;G)1W?yoZtmvnCvv14>4 zYR4o%65>ZBTfL6jhKsC<>9$?JOw{|$F5ahy1$g4WFcq5T^#dsEwZq@GFIDk?3>U?} Dr?6*Q literal 0 HcmV?d00001 diff --git a/registration/locale/ru/LC_MESSAGES/django.po b/registration/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..072e146a --- /dev/null +++ b/registration/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-21 20:12+0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Активировать учетные записи" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Выслать ключи активации заново" + +#: forms.py:35 +msgid "Username" +msgstr "Имя пользователя" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Это поле может содержать только буквы, цифры и подчеркивания" + +#: forms.py:39 +msgid "Email address" +msgstr "Адрес электронной почты" + +#: forms.py:41 +msgid "Password" +msgstr "Пароль" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Пароль (снова)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Пользователь с таким именем уже существует." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Введенные пароли не совпадают." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Я прочитал Правила Использования и согласен с ними" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Для регистрации Вы должны согласиться с Правилами" + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "" +"Этот адрес электронной почты уже используется. Пожалуйста, введите другой " +"адрес." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Регистрация с использованием свободных почтовых серверов запрещена. " +"Пожалуйста, введите другой адрес электронной почты." + +#: models.py:165 +msgid "user" +msgstr "пользователь" + +#: models.py:166 +msgid "activation key" +msgstr "ключ активации" + +#: models.py:171 +msgid "registration profile" +msgstr "карточка регистрации" + +#: models.py:172 +msgid "registration profiles" +msgstr "карточки регистрации" diff --git a/registration/locale/sl/LC_MESSAGES/django.mo b/registration/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..133f5a1bea7d5d234b2ce7f95bd7c494565ed64a GIT binary patch literal 1889 zcmb7^&2Jnv7{(2>d@SGPL#hPQdns*1yqOKH2ur9ELZ~7o?UF1J^n$!Q@6LL6#$MT; zO_KxvK~4z7flCkEIKYt};F6r_g%eW6nL854KHje+&bxej*H;y_+9{?0Y3)gJ{ut9 zh-Xn>Mtu%-TB1MGf-nKevl2DM0vWRs=Z$m50((XUGDHP6?k%28^dkBsR;l#tXitYO zg{}&tPooMZl{;4HKJgvxgRhF!cF;o=cogBqdZBbqDoq`GFE*&FhD>n;DTA6hW(pQ_ zGBw#1o@|G9*bQ}?MMHVNXI(mbp(`p=+RTYAYalk~5ZL*7GG)=i%gET$ zqi>uWne#tdjtkoBjx04#;HkA*u>6G!g3f9$WOS!(K zEtmG#SX?k#E>?=7sCs=J!6qwJ#;8tQF9$GIy)G;b4SOUi zrLN3o{Z*_RS395#s&v$A@VC=L-UaM(x*_WEX#2y-CiHyF{QpeL8OH27PK`x|<*Ezm zL(eVDM_xh0(V^?}Jhe6cPYB63uqm40C|AX8HOV3ucWtAT0;dAS_%DiX2FUxjm!o4C hyQHa~_sXNg(;oT0jzW=jk8af`CofK&xs69I9s)!7CkFrk literal 0 HcmV?d00001 diff --git a/registration/locale/sl/LC_MESSAGES/django.po b/registration/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 00000000..0996851c --- /dev/null +++ b/registration/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,87 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.8.1beta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-12 14:09-0500\n" +"PO-Revision-Date: 2011-11-05 21:20+0100\n" +"Last-Translator: Marko Mrdjenovic \n" +"Language-Team: Slovenian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Slovenian\n" +"X-Poedit-Country: SLOVENIA\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Aktiviraj uporabnike" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Ponovno pošlji aktivacijsko e-pošto" + +#: forms.py:35 +msgid "username" +msgstr "uporabniško ime" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Vrednost lahko vsebuje samo črke, cifre in podčrtaje." + +#: forms.py:39 +msgid "Email address" +msgstr "E-naslov" + +#: forms.py:41 +msgid "Password" +msgstr "Geslo" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Geslo (ponovno)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Uporabnik s tem uporabniškim imenom že obstaja." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "Polji z gesli se ne ujemata." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Strinjam se s pogoji uporabe" + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Za registracijo se morate strinjati s pogoji uporabe" + +#: forms.py:95 +msgid "This email address is already in use. Please supply a different email address." +msgstr "E-naslov je že v uporabi, prosimo vnesite drugega." + +#: forms.py:122 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "Registracija ni mogoča z brezplačnimi e-naslovi. Prosimo vnesite drug e-naslov." + +#: models.py:165 +msgid "user" +msgstr "Uporabnik" + +#: models.py:166 +msgid "activation key" +msgstr "Aktivacijski ključ" + +#: models.py:171 +msgid "registration profile" +msgstr "Registracijski profil" + +#: models.py:172 +msgid "registration profiles" +msgstr "Registracijski profili" + diff --git a/registration/locale/sr/LC_MESSAGES/django.mo b/registration/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1699326553efe848408441bb04e452d14f341774 GIT binary patch literal 1966 zcmb7^O>Y}T7{>=F6wIqC5USwtP>GVzu30B7ik!L-`huc1ZIn0_(-_#C_gu7dmEC*YspBKR-(7WlzSLc9rn3cd=i zfFai!_%65wz6WOD3GjO`*!>9pgIqs@%lOtW3z34qfj7XDuL#isx4{kYC-55h7kC;x zeNu>1;4=6Icpb!$*aqJQzXe1791Qt?07KqK)A3(Hq_113Kg0<21>ac<^LTyw5n`j% zx`jBihA;wB2$Wsx(Ewk=Bi5-eM@*JwN>by=EHimSzR%QUTRJkkw9R&;5*AyWDd(;9 z%4n*b(i!ardoHCaNT#V}=h%^QG_!UzP-x!o9wZWuqQ|wGV93@hd(Wp5w+Dqgw z*n76_Jn5?Jp;K#C=@i|>VDjRwsi>@+pBEB75E81|T0pkPc78mB-Vob`8i&%k?~F}} zWzr|FN)|HlYBW)Nz+*9|j+ogWb!b6mD0ERwGEJ8Xi?OQ;e&$anf#H8yW|qbpdouu-C`(sP@Z z;&>&BFGTT0YAv@fw$8=)1H)*GM=GRwhTVmB9G{C@u)8UpkGfWBS4eMcn{IK>o6ahkanxm5qOOhgjcdo#YBl4=6|5|FV${Vtw8`^* z|JksBf~%DDrFHB(JKgKi%CTLj0lPQ4rW2Fm1hi=d+q|(^R8|(zb%T{|lOEQeuCu&K zlWs?U+=@G$7M(pyp&NhHX|?DJiV4>EzT8=w4PEM72;GI+>{2VH2M;DLu!$Gp(}K^^ zYU7(|({QSMG@E5R9MqnY`grJyskFD_Hr?I%`u6tCwL9x;jj+TA`^rlbHXSK~riXuU zN#Tr2oUy`;R4Hj-tU7#r@Q`&bkB)w#^0^VX_1Hl&uT@4IO>Y961xY#6p6o%eoV9Gy zhQW4Zsx*5=sjaeV&c14j+ao#ms}3>ZgNIa6H8kFGPaVYx`l}lR`2xlIN)x4hxFLd<-M~4j(Jrvtdw&a9FKM$U(Rl y5*!>wgCegE_K)s{Aik)5W}t, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-registration trunk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-04-05 13:51+0200\n" +"PO-Revision-Date: 2008-04-05 14:00+0100\n" +"Last-Translator: Nebojsa Djordjevic \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\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" +"X-Poedit-Language: Serbian\n" +"X-Poedit-Country: YUGOSLAVIA\n" + +#: forms.py:38 +msgid "username" +msgstr "korisničko ime" + +#: forms.py:41 +msgid "email address" +msgstr "email adresa" + +#: forms.py:43 +msgid "password" +msgstr "šifra" + +#: forms.py:45 +msgid "password (again)" +msgstr "šifra (ponovo)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Korisničko ime može da se sastoji samo od slova, brojeva i donje crte (\"_\")" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Korisničko ime je već zauzeto. Izaberite drugo." + +#: forms.py:71 +msgid "You must type the same password each time" +msgstr "Unete šifre se ne slažu" + +#: forms.py:100 +msgid "I have read and agree to the Terms of Service" +msgstr "Pročitao sam i slažem se sa uslovima korišćenja" + +#: forms.py:109 +msgid "You must agree to the terms to register" +msgstr "Morate se složiti sa uslovima korišćenja da bi ste se registrovali" + +#: forms.py:128 +msgid "This email address is already in use. Please supply a different email address." +msgstr "Ova e-mail adresa je već u upotrebi. Morate koristiti drugu e-mail adresu." + +#: forms.py:153 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "Registracija korišćenjem besplatnig e-mail adresa je zabranjena. Morate uneti drugu e-mail adresu." + +#: models.py:188 +msgid "user" +msgstr "korisnik" + +#: models.py:189 +msgid "activation key" +msgstr "aktivacioni ključ" + +#: models.py:194 +msgid "registration profile" +msgstr "registracioni profil" + +#: models.py:195 +msgid "registration profiles" +msgstr "registracioni profili" + diff --git a/registration/locale/sv/LC_MESSAGES/django.mo b/registration/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..50eca67e21301f5081b881b054ec648a67e25509 GIT binary patch literal 1687 zcmb7^&2A$_5XT!>STLWbWfg3^`kvMRS#T(=W=EO_Dl`C(+zsF7-qrEW7%&%u$RbBnBs{Hx-jb8+=*Kog! z`#0Qg`}I?J;Cc)O;1v8C{2e?5Z$2%=C*Ub~7yKD~AN&Jc1OEYE0pEE>h?l_+z~{j# z==Z9FZ-QO$EieXefZu`M?g#Kw?DZ4)9^P~OxC8zT-T~L26=Dlya3A~?+y?&w34G%@ zA#Q;mfiHpk;0xd}==c8$#Gg=j`2EIU3H%=P`ThuE`{MHNK8DZl)#A(i;p4oxc!#+_ zs>S8wU0ye_fD{606?*tRd>*1n136(bEF+Q%cWju+X>tRm9-GXP?$a@wNfNT?a-3La zq)W7-u}xG=eQ(d1Oj43jWY}7^lvo-WJxI3eCnU!ZOr2ym+X`l#Q)h6%sxW5~`X)KsHM|HyuH5h;4n2BWdlo z+C;=M9FR*g7BY0nWUly-r(#7NacO_GpxZJ=qHAKl)1p);Mn6gUi65=-3Kb78lQ=T^ z8xCF2jDk}f3ze?XQGNHz`ay$E8{Ok(=dje}kv1-9+c=4WopEe~o~}{psM8B}Q7hjb z!Jc$nqpeD%8dSD}t!>(@);_+oUfHZvU>J0HlK9{YyN8W>H)wZ)y*ho~skNKyk2;5q zQcGGF^o&$Cl}?))H8S+sv15fU%r7#!$Jv9S8a=QBfR(nw^hc#zN1RMMFqT9=j|U)6b{E84ibH z4?~g9EKYc($)zL+dI5c~<)UMu7yd!SVke(P5^7#pR(>KD0VaO?G#N@!A7U`rpafP; k!y%`laZOgyy7XMG=yn2y)_jX&92P+DU!9VdORtak7w$#!*8l(j literal 0 HcmV?d00001 diff --git a/registration/locale/sv/LC_MESSAGES/django.po b/registration/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 00000000..dec76e27 --- /dev/null +++ b/registration/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,81 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-03-23 18:59+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Emil Stenström \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .\forms.py:38 +msgid "username" +msgstr "Användarnamn" + +#: .\forms.py:41 +msgid "email address" +msgstr "E-postadress" + +#: .\forms.py:43 +msgid "password" +msgstr "Lösenord" + +#: .\forms.py:45 +msgid "password (again)" +msgstr "Lösenord (igen)" + +#: .\forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "Användarnamn får bara innehålla bokstäver, siffror och understreck" + +#: .\forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "Det användarnamnet är upptaget. Prova ett annat." + +#: .\forms.py:71 +msgid "You must type the same password each time" +msgstr "Båda lösenord måste vara lika" + +#: .\forms.py:100 +msgid "I have read and agree to the Terms of Service" +msgstr "Jag har läst och accepterar avtalet" + +#: .\forms.py:109 +msgid "You must agree to the terms to register" +msgstr "Du måste acceptera avtalet för att registrera dig" + +#: .\forms.py:128 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Den e-postadressen är upptagen, använd an annan adress." + +#: .\forms.py:153 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "Gratis e-postadresser är inte tillåtna, använd en annan adress." + +#: .\models.py:188 +msgid "user" +msgstr "Användare" + +#: .\models.py:189 +msgid "activation key" +msgstr "Aktiveringsnyckel" + +#: .\models.py:194 +msgid "registration profile" +msgstr "Profil" + +#: .\models.py:195 +msgid "registration profiles" +msgstr "Profiler" diff --git a/registration/locale/tr_TR/LC_MESSAGES/django.mo b/registration/locale/tr_TR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a208e1e4919ab326768f193758d6fef5f6028f47 GIT binary patch literal 1945 zcmb7^O>Y}T7{>=FZ|1$C2M|b)glH4WZkz~-$b>3xVp=P4V!2LHbAj>hGmejtt0@gi2k zkQ+!>K4vmylG?D0$HaG)bv6|B$f-T)xZGhyBb7>%jAO&riY5)@9+S5qnPDb|nOqK^ zOkFmqrMyqK*zBo@MO#|CpPTq}L31*ZDw`J_4lH~7NidaX#6FP4mjrnj>HNFGsw|)65| z&aOC0rHclB7yQqJ^Z}<*DW4fXQBYX#NnJ3dg>@9=nS&0LXGm7Fb8PH~loe?Yi&EGk zi?NJys2++Pl+M>m+{ufHgBjgn4c$=$Q)Oid~zJJ0fPp`oyOA48A&}Es{XtTa` zW5?&dvbnjcRhXOPY!7m7HCv6dgD!^E${Ol}-U+(n5f0$^u3H#s6zmg<2GUq|pYC)& z3zpCJ`TWptK_iRu7(H8~Wi)0*TrX%?Xf3nj!|3=B?R$KfNwRXFM$}Vg=3}qWMV88; zlcCr+Gt$y{%OP$hZh;exQEr`tE3}3Z^-Rm(?xzx-j6@*pMJ&pPMO>r=i=l*H;#iGy zQ=}oTqRF*90nIrc8foT5-TRkz>@Q+aMmY5~=1j$$QF8RNZ%T3WePq~KbwFr=(^NDY zMd&L893LOLv$#6tl!v&a%7nCe^o#4mS6`Z;MxI`S^IjBEHY!sGp*VgpRJf%+TfYsz ziT`3;_ya@9(91h(Jrz5R`&LRV?Llu|o7`avBeIHsXq zsWs9tvZpi-cfM$4rNzcXid>_rq+ptzE7MdVm$Jq+D9>D0c~S+L$$|4B#EGDjd#h$2 Mz3O6mXmptP4`8BC3;+NC literal 0 HcmV?d00001 diff --git a/registration/locale/tr_TR/LC_MESSAGES/django.po b/registration/locale/tr_TR/LC_MESSAGES/django.po new file mode 100644 index 00000000..295c524d --- /dev/null +++ b/registration/locale/tr_TR/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-11 12:48+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: RECEP KIRMIZI \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin.py:23 +msgid "Activate users" +msgstr "Kullanıcıları aktive et" + +#: admin.py:43 +msgid "Re-send activation emails" +msgstr "Aktivasyon e-postalarını yeniden gönder" + +#: forms.py:35 +msgid "Username" +msgstr "Kullanıcı adı" + +#: forms.py:36 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Bu alan sadece harfler, numaralar ve alt çizgiler barındırabilir." + +#: forms.py:39 +msgid "Email address" +msgstr "Eposta adresi" + +#: forms.py:41 +msgid "Password" +msgstr "Parola" + +#: forms.py:43 +msgid "Password (again)" +msgstr "Parola (tekrar)" + +#: forms.py:55 +msgid "A user with that username already exists." +msgstr "Bu kullanıcı adına sahip bir kullanıcı bulunmakta." + +#: forms.py:67 +msgid "The two password fields didn't match." +msgstr "İki parola birbiri ile uyuşmadı." + +#: forms.py:78 +msgid "I have read and agree to the Terms of Service" +msgstr "Anlaşma kurallarını okudum ve kabul ediyorum." + +#: forms.py:79 +msgid "You must agree to the terms to register" +msgstr "Kayıt olmak için kuralları kabul etmelisiniz." + +#: forms.py:95 +msgid "" +"This email address is already in use. Please supply a different email " +"address." +msgstr "Bu eposta adresi kullanımda. Lütfen farklı bir eposta adresi veriniz." + +#: forms.py:122 +msgid "" +"Registration using free email addresses is prohibited. Please supply a " +"different email address." +msgstr "" +"Ücretsiz eposta adresleri ile kayıt kabul edilmemektedir. Lütfen farklı bir " +"eposta adresi veriniz." + +#: models.py:168 +msgid "user" +msgstr "kullanıcı" + +#: models.py:169 +msgid "activation key" +msgstr "aktivasyon anahtarı" + +#: models.py:174 +msgid "registration profile" +msgstr "kayıt profili" + +#: models.py:175 +msgid "registration profiles" +msgstr "kayıt profilleri" diff --git a/registration/locale/zh_CN/LC_MESSAGES/django.mo b/registration/locale/zh_CN/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ece5cc97b10d0ace9a2ba33ce927e95d8e48ec49 GIT binary patch literal 1669 zcmb7@?@t^>7{{ktt)4&AXnav$%nPGdyXOK?;iwIWNKl}J9whq4O!tPpwRgLhojEKq zCI=P-%LPQMMri^KRMOg9qeLiBc;yTK3E%W)x$_P2Kkz%Z2iHq{)5-39W@evxetc*4 z@8d_W5VU9UzKC}L?+bc-1RdH%&;UolPrzTmKJeH>guDd~fvsR3dCj!2cH86z~@05JPLjRYP)f;1+gxJFJb;CKK6tEfFFRZkA!(mf+pr` z;0aKH+WyF+gggnpTxAo8hqR$P4t7=7Kd#aS@eqmbaqx2x;VVt&uYDmjd8V=wcDjxy zs&l;;saBfK|DYYi08$X7Rna2?YX790CfNw5K4%HaT)ei=Ih7ujNlxS3PYdb|({tP( zaV$;-xa|n(GwFCP%?ii0>9DrvY38ITOC)?Q1Q*m1G~;_o=e#3%B1-#HoC!`vHj_z> zQbrTb@G$qeE9*B#Nj!<2bMEfeYYy-&F%jqZdogtBnbG1}kW@nL&cCmre>IM;o)FEYS0 zo-d7FVLJ)q-K;H)xEG_5{)%3X~ccziWHNcAEU{v%tD_uJ$*20v-RDJT3-4L z%w0RnY;MFkOUGzWdtcX}PWyCEPg}}~dcJ)o(%aqJSu3m|YDPM6wz!K%948T@l3$c> zWKz(um0C&W3ohRojK6O**X(pYxW7iHYk3L$12Ni+iyk4t)HiDVxAKn@rNWlF^M{(7 z2`RRsQpl%H*1Pjx}&CM{z1G++1!PL5% z%fn6S+D(;T#7gJ`DU@^5VLCc+&2;ug>C3xnWpCBgWr+MOsbZH3B&rB-D*{8rleR!yuFH, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2008-03-20 23:22+0800\n" +"Last-Translator: hutuworm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "用户名" + +#: forms.py:41 +msgid "email address" +msgstr "Email 地址" + +#: forms.py:43 +msgid "password" +msgstr "密码" + +#: forms.py:45 +msgid "password (again)" +msgstr "密码(重复)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "用户名只能包含字母、数字和下划线" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "该用户名已被占用,请另选一个。" + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "您必须输入两遍同样的密码" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "我已阅读并同意该服务条款" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "您必须同意注册条款" + +#: forms.py:124 +msgid "This email address is already in use. Please supply a different email address." +msgstr "该 Email 地址已有人使用,请提供一个另外的 Email 地址。" + +#: forms.py:149 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "禁止使用免费 Email 地址注册,请提供一个另外的 Email 地址。" + +#: models.py:188 +msgid "user" +msgstr "用户" + +#: models.py:189 +msgid "activation key" +msgstr "激活密钥" + +#: models.py:194 +msgid "registration profile" +msgstr "注册信息" + +#: models.py:195 +msgid "registration profiles" +msgstr "注册信息" + diff --git a/registration/locale/zh_TW/LC_MESSAGES/django.mo b/registration/locale/zh_TW/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..24a3534958925d49ab1e1032f3cd2d50e28cd3e8 GIT binary patch literal 1669 zcmb7@?@t^>7{{ktt)4&AXnav$%nPGd-E)DcaMT7wBq&fq4-$Q2rhCKQ+PmG$&K#B) zlYz5_j$aFc%Reb1L)AsfCe}YehmHu4uFRqAmmMO1Z)TM;7j0N;8E~j@JaB< zgM>T*z5+f1wt_lVC-@9F1U?Je;6d!XO5#cEY;dMsv6N14oH{xtzh8IQ;=3%(@AV|vY3}YjvXY*M^qA|R zXg^AZYdZwBm`gnuIa{798RDn7l-w7uQ8$}Dg+W!btee2l@=!ea(96(#nu?Ipz zRlh1A_v?0YJOjNUw$M3dm=K?Oeu8plC8>1MoG?o|W1-@w`8a7%hwRz!59rIxMxsYa z7^!wtIE+yz#s7Cv5Uo(P(=w4k-}{7H(&$YXBPa_e9ixMtT_1GzbkmXUp_9EQ1|mZ| z$H#c^>w72sOQ_qBmKSo-SxtnqGqHEXN$XN#BmZaD)|}t zdL{)8+o_dgzTooh;rM$-Yu!%ggZpcAyOx*0KM

xabiQ%v@BrHY!(sEB~4+6_(Y) zTySo_yt)xA=GE-i!P2$hmo2ihJP}-9Ds67>Tv}06`SQjc+Fkv7)Zz_wEf@U0qNXqG z7U#-qv%&mAY3rL(A*XV)YJOS$aAoJ}xd!XIxk-Wm4QogtSUg|4eLIYCpRSNqF!P66 z$iq!}X|1$*2`ixwq)?eCgz4zOb<_Eu%V#&$+>}~aQ`f%=*7J9B6T#&I#_G$tQejqI zIJ>6+nG?Au+*9?``^mNf|~kKO|4cY^4f0YdlaqKr+1c$B-qXcH}7Cl pxp;%zs~V{pgxD?4RKCcot<~M)c@jn`ZGRU`tT#@={Oe_q{{ZHmUoijx literal 0 HcmV?d00001 diff --git a/registration/locale/zh_TW/LC_MESSAGES/django.po b/registration/locale/zh_TW/LC_MESSAGES/django.po new file mode 100644 index 00000000..7cc090d0 --- /dev/null +++ b/registration/locale/zh_TW/LC_MESSAGES/django.po @@ -0,0 +1,77 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-19 19:30-0500\n" +"PO-Revision-Date: 2008-03-20 23:22+0800\n" +"Last-Translator: hutuworm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:38 +msgid "username" +msgstr "用戶名" + +#: forms.py:41 +msgid "email address" +msgstr "Email 地址" + +#: forms.py:43 +msgid "password" +msgstr "密碼" + +#: forms.py:45 +msgid "password (again)" +msgstr "密碼(重復)" + +#: forms.py:54 +msgid "Usernames can only contain letters, numbers and underscores" +msgstr "用戶名只能包含字母、數字和下劃線" + +#: forms.py:59 +msgid "This username is already taken. Please choose another." +msgstr "該用戶名已被佔用,請另選一個。" + +#: forms.py:68 +msgid "You must type the same password each time" +msgstr "您必須輸入兩遍同樣的密碼" + +#: forms.py:96 +msgid "I have read and agree to the Terms of Service" +msgstr "我已閱讀並同意該服務條款" + +#: forms.py:105 +msgid "You must agree to the terms to register" +msgstr "您必須同意注冊條款" + +#: forms.py:124 +msgid "This email address is already in use. Please supply a different email address." +msgstr "該 Email 地址已有人使用,請提供一個另外的 Email 地址。" + +#: forms.py:149 +msgid "Registration using free email addresses is prohibited. Please supply a different email address." +msgstr "禁止使用免費 Email 地址注冊,請提供一個另外的 Email 地址。" + +#: models.py:188 +msgid "user" +msgstr "用戶" + +#: models.py:189 +msgid "activation key" +msgstr "激活密鑰" + +#: models.py:194 +msgid "registration profile" +msgstr "注冊信息" + +#: models.py:195 +msgid "registration profiles" +msgstr "注冊信息" + diff --git a/registration/management/__init__.py b/registration/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/registration/management/commands/__init__.py b/registration/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/registration/management/commands/cleanupregistration.py b/registration/management/commands/cleanupregistration.py new file mode 100644 index 00000000..abec5aed --- /dev/null +++ b/registration/management/commands/cleanupregistration.py @@ -0,0 +1,19 @@ +""" +A management command which deletes expired accounts (e.g., +accounts which signed up but never activated) from the database. + +Calls ``RegistrationProfile.objects.delete_expired_users()``, which +contains the actual logic for determining which accounts are deleted. + +""" + +from django.core.management.base import NoArgsCommand + +from registration.models import RegistrationProfile + + +class Command(NoArgsCommand): + help = "Delete expired user registrations from the database" + + def handle_noargs(self, **options): + RegistrationProfile.objects.delete_expired_users() diff --git a/registration/models.py b/registration/models.py new file mode 100644 index 00000000..c44e3baf --- /dev/null +++ b/registration/models.py @@ -0,0 +1,270 @@ +import datetime +import hashlib +import random +import re + +from django.conf import settings +from django.contrib.auth.models import User +from django.db import models +from django.db import transaction +from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ + +try: + from django.contrib.auth import get_user_model + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User + +try: + from django.utils.timezone import now as datetime_now +except ImportError: + datetime_now = datetime.datetime.now + + +SHA1_RE = re.compile('^[a-f0-9]{40}$') + + +class RegistrationManager(models.Manager): + """ + Custom manager for the ``RegistrationProfile`` model. + + The methods defined here provide shortcuts for account creation + and activation (including generation and emailing of activation + keys), and for cleaning out expired inactive accounts. + + """ + def activate_user(self, activation_key): + """ + Validate an activation key and activate the corresponding + ``User`` if valid. + + If the key is valid and has not expired, return the ``User`` + after activating. + + If the key is not valid or has expired, return ``False``. + + If the key is valid but the ``User`` is already active, + return ``False``. + + To prevent reactivation of an account which has been + deactivated by site administrators, the activation key is + reset to the string constant ``RegistrationProfile.ACTIVATED`` + after successful activation. + + """ + # Make sure the key we're trying conforms to the pattern of a + # SHA1 hash; if it doesn't, no point trying to look it up in + # the database. + if SHA1_RE.search(activation_key): + try: + profile = self.get(activation_key=activation_key) + except self.model.DoesNotExist: + return False + if not profile.activation_key_expired(): + user = profile.user + user.is_active = True + user.save() + profile.activation_key = self.model.ACTIVATED + profile.save() + return user + return False + + def create_inactive_user(self, first_name, last_name, email, password, + site, send_email=True): + """ + Create a new, inactive ``User``, generate a + ``RegistrationProfile`` and email its activation key to the + ``User``, returning the new ``User``. + + By default, an activation email will be sent to the new + user. To disable this, pass ``send_email=False``. + + """ + new_user = User.objects.create_user(email, first_name, last_name, password) + new_user.is_active = False + new_user.save() + + registration_profile = self.create_profile(new_user) + + if send_email: + registration_profile.send_activation_email(site) + + return new_user + create_inactive_user = transaction.commit_on_success(create_inactive_user) + + def create_profile(self, user): + """ + Create a ``RegistrationProfile`` for a given + ``User``, and return the ``RegistrationProfile``. + + The activation key for the ``RegistrationProfile`` will be a + SHA1 hash, generated from a combination of the ``User``'s + username and a random salt. + + """ + salt = hashlib.sha1(str(random.random())).hexdigest()[:5] + username = user.get_full_name() + if isinstance(username, unicode): + username = username.encode('utf-8') + activation_key = hashlib.sha1(salt+username).hexdigest() + return self.create(user=user, + activation_key=activation_key) + + def delete_expired_users(self): + """ + Remove expired instances of ``RegistrationProfile`` and their + associated ``User``s. + + Accounts to be deleted are identified by searching for + instances of ``RegistrationProfile`` with expired activation + keys, and then checking to see if their associated ``User`` + instances have the field ``is_active`` set to ``False``; any + ``User`` who is both inactive and has an expired activation + key will be deleted. + + It is recommended that this method be executed regularly as + part of your routine site maintenance; this application + provides a custom management command which will call this + method, accessible as ``manage.py cleanupregistration``. + + Regularly clearing out accounts which have never been + activated serves two useful purposes: + + 1. It alleviates the ocasional need to reset a + ``RegistrationProfile`` and/or re-send an activation email + when a user does not receive or does not act upon the + initial activation email; since the account will be + deleted, the user will be able to simply re-register and + receive a new activation key. + + 2. It prevents the possibility of a malicious user registering + one or more accounts and never activating them (thus + denying the use of those usernames to anyone else); since + those accounts will be deleted, the usernames will become + available for use again. + + If you have a troublesome ``User`` and wish to disable their + account while keeping it in the database, simply delete the + associated ``RegistrationProfile``; an inactive ``User`` which + does not have an associated ``RegistrationProfile`` will not + be deleted. + + """ + for profile in self.all(): + try: + if profile.activation_key_expired(): + user = profile.user + if not user.is_active: + user.delete() + profile.delete() + except User.DoesNotExist: + profile.delete() + +class RegistrationProfile(models.Model): + """ + A simple profile which stores an activation key for use during + user account registration. + + Generally, you will not want to interact directly with instances + of this model; the provided manager includes methods + for creating and activating new accounts, as well as for cleaning + out accounts which have never been activated. + + While it is possible to use this model as the value of the + ``AUTH_PROFILE_MODULE`` setting, it's not recommended that you do + so. This model's sole purpose is to store data temporarily during + account registration and activation. + + """ + ACTIVATED = u"ALREADY_ACTIVATED" + + user = models.ForeignKey(User, unique=True, verbose_name=_('user')) + activation_key = models.CharField(_('activation key'), max_length=40) + + objects = RegistrationManager() + + class Meta: + verbose_name = _('registration profile') + verbose_name_plural = _('registration profiles') + + def __unicode__(self): + return u"Registration information for %s" % self.user + + def activation_key_expired(self): + """ + Determine whether this ``RegistrationProfile``'s activation + key has expired, returning a boolean -- ``True`` if the key + has expired. + + Key expiration is determined by a two-step process: + + 1. If the user has already activated, the key will have been + reset to the string constant ``ACTIVATED``. Re-activating + is not permitted, and so this method returns ``True`` in + this case. + + 2. Otherwise, the date the user signed up is incremented by + the number of days specified in the setting + ``ACCOUNT_ACTIVATION_DAYS`` (which should be the number of + days after signup during which a user is allowed to + activate their account); if the result is less than or + equal to the current date, the key has expired and this + method returns ``True``. + + """ + expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) + return self.activation_key == self.ACTIVATED or \ + (self.user.date_joined + expiration_date <= datetime_now()) + activation_key_expired.boolean = True + + def send_activation_email(self, site): + """ + Send an activation email to the user associated with this + ``RegistrationProfile``. + + The activation email will make use of two templates: + + ``registration/activation_email_subject.txt`` + This template will be used for the subject line of the + email. Because it is used as the subject line of an email, + this template's output **must** be only a single line of + text; output longer than one line will be forcibly joined + into only a single line. + + ``registration/activation_email.txt`` + This template will be used for the body of the email. + + These templates will each receive the following context + variables: + + ``activation_key`` + The activation key for the new account. + + ``expiration_days`` + The number of days remaining during which the account may + be activated. + + ``site`` + An object representing the site on which the user + registered; depending on whether ``django.contrib.sites`` + is installed, this may be an instance of either + ``django.contrib.sites.models.Site`` (if the sites + application is installed) or + ``django.contrib.sites.models.RequestSite`` (if + not). Consult the documentation for the Django sites + framework for details regarding these objects' interfaces. + + """ + ctx_dict = {'activation_key': self.activation_key, + 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS, + 'site': site} + subject = render_to_string('registration/activation_email_subject.txt', + ctx_dict) + # Email subject *must not* contain newlines + subject = ''.join(subject.splitlines()) + + message = render_to_string('registration/activation_email.txt', + ctx_dict) + + self.user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) \ No newline at end of file diff --git a/registration/signals.py b/registration/signals.py new file mode 100644 index 00000000..343e3a55 --- /dev/null +++ b/registration/signals.py @@ -0,0 +1,8 @@ +from django.dispatch import Signal + + +# A new user has registered. +user_registered = Signal(providing_args=["user", "request"]) + +# A user has activated his or her account. +user_activated = Signal(providing_args=["user", "request"]) diff --git a/registration/tests/__init__.py b/registration/tests/__init__.py new file mode 100644 index 00000000..82202ca1 --- /dev/null +++ b/registration/tests/__init__.py @@ -0,0 +1,4 @@ +from registration.tests.default_backend import * +from registration.tests.forms import * +from registration.tests.models import * +from registration.tests.simple_backend import * diff --git a/registration/tests/default_backend.py b/registration/tests/default_backend.py new file mode 100644 index 00000000..cdf1b0ad --- /dev/null +++ b/registration/tests/default_backend.py @@ -0,0 +1,198 @@ +import datetime + +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.sites.models import Site +from django.core import mail +from django.core.urlresolvers import reverse +from django.test import TestCase + +from registration import signals +from registration.admin import RegistrationAdmin +from registration.forms import RegistrationForm +from registration.backends.default.views import RegistrationView +from registration.models import RegistrationProfile + + +class DefaultBackendViewTests(TestCase): + """ + Test the default registration backend. + + Running these tests successfully will require two templates to be + created for the sending of activation emails; details on these + templates and their contexts may be found in the documentation for + the default backend. + + """ + urls = 'registration.backends.default.urls' + + def setUp(self): + """ + Create an instance of the default backend for use in testing, + and set ``ACCOUNT_ACTIVATION_DAYS`` if it's not set already. + + """ + self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None) + if self.old_activation is None: + settings.ACCOUNT_ACTIVATION_DAYS = 7 # pragma: no cover + + def tearDown(self): + """ + Yank ``ACCOUNT_ACTIVATION_DAYS`` back out if it wasn't + originally set. + + """ + if self.old_activation is None: + settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation # pragma: no cover + + def test_allow(self): + """ + The setting ``REGISTRATION_OPEN`` appropriately controls + whether registration is permitted. + + """ + old_allowed = getattr(settings, 'REGISTRATION_OPEN', True) + settings.REGISTRATION_OPEN = True + + resp = self.client.get(reverse('registration_register')) + self.assertEqual(200, resp.status_code) + + settings.REGISTRATION_OPEN = False + + # Now all attempts to hit the register view should redirect to + # the 'registration is closed' message. + resp = self.client.get(reverse('registration_register')) + self.assertRedirects(resp, reverse('registration_disallowed')) + + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + self.assertRedirects(resp, reverse('registration_disallowed')) + + settings.REGISTRATION_OPEN = old_allowed + + def test_registration_get(self): + """ + HTTP ``GET`` to the registration view uses the appropriate + template and populates a registration form into the context. + + """ + resp = self.client.get(reverse('registration_register')) + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, + 'registration/registration_form.html') + self.failUnless(isinstance(resp.context['form'], + RegistrationForm)) + + def test_registration(self): + """ + Registration creates a new inactive account and a new profile + with activation key, populates the correct account data and + sends an activation email. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + self.assertRedirects(resp, reverse('registration_complete')) + + new_user = User.objects.get(username='bob') + + self.failUnless(new_user.check_password('secret')) + self.assertEqual(new_user.email, 'bob@example.com') + + # New user must not be active. + self.failIf(new_user.is_active) + + # A registration profile was created, and an activation email + # was sent. + self.assertEqual(RegistrationProfile.objects.count(), 1) + self.assertEqual(len(mail.outbox), 1) + + def test_registration_no_sites(self): + """ + Registration still functions properly when + ``django.contrib.sites`` is not installed; the fallback will + be a ``RequestSite`` instance. + + """ + Site._meta.installed = False + + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + self.assertEqual(302, resp.status_code) + + new_user = User.objects.get(username='bob') + + self.failUnless(new_user.check_password('secret')) + self.assertEqual(new_user.email, 'bob@example.com') + + self.failIf(new_user.is_active) + + self.assertEqual(RegistrationProfile.objects.count(), 1) + self.assertEqual(len(mail.outbox), 1) + + Site._meta.installed = True + + def test_registration_failure(self): + """ + Registering with invalid data fails. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'notsecret'}) + self.assertEqual(200, resp.status_code) + self.failIf(resp.context['form'].is_valid()) + self.assertEqual(0, len(mail.outbox)) + + def test_activation(self): + """ + Activation of an account functions properly. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + + profile = RegistrationProfile.objects.get(user__username='bob') + + resp = self.client.get(reverse('registration_activate', + args=(), + kwargs={'activation_key': profile.activation_key})) + self.assertRedirects(resp, reverse('registration_activation_complete')) + + def test_activation_expired(self): + """ + An expired account can't be activated. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + + profile = RegistrationProfile.objects.get(user__username='bob') + user = profile.user + user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) + user.save() + + resp = self.client.get(reverse('registration_activate', + args=(), + kwargs={'activation_key': profile.activation_key})) + + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, 'registration/activate.html') + self.failIf('activation_key' in resp.context) diff --git a/registration/tests/forms.py b/registration/tests/forms.py new file mode 100644 index 00000000..dbb1f060 --- /dev/null +++ b/registration/tests/forms.py @@ -0,0 +1,119 @@ +from django.contrib.auth.models import User +from django.test import TestCase + +from registration import forms + + +class RegistrationFormTests(TestCase): + """ + Test the default registration forms. + + """ + def test_registration_form(self): + """ + Test that ``RegistrationForm`` enforces username constraints + and matching passwords. + + """ + # Create a user so we can verify that duplicate usernames aren't + # permitted. + User.objects.create_user('alice', 'alice@example.com', 'secret') + + invalid_data_dicts = [ + # Non-alphanumeric username. + {'data': {'username': 'foo/bar', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo'}, + 'error': ('username', [u"This value may contain only letters, numbers and @/./+/-/_ characters."])}, + # Already-existing username. + {'data': {'username': 'alice', + 'email': 'alice@example.com', + 'password1': 'secret', + 'password2': 'secret'}, + 'error': ('username', [u"A user with that username already exists."])}, + # Mismatched passwords. + {'data': {'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'bar'}, + 'error': ('__all__', [u"The two password fields didn't match."])}, + ] + + for invalid_dict in invalid_data_dicts: + form = forms.RegistrationForm(data=invalid_dict['data']) + self.failIf(form.is_valid()) + self.assertEqual(form.errors[invalid_dict['error'][0]], + invalid_dict['error'][1]) + + form = forms.RegistrationForm(data={'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo'}) + self.failUnless(form.is_valid()) + + def test_registration_form_tos(self): + """ + Test that ``RegistrationFormTermsOfService`` requires + agreement to the terms of service. + + """ + form = forms.RegistrationFormTermsOfService(data={'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo'}) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['tos'], + [u"You must agree to the terms to register"]) + + form = forms.RegistrationFormTermsOfService(data={'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo', + 'tos': 'on'}) + self.failUnless(form.is_valid()) + + def test_registration_form_unique_email(self): + """ + Test that ``RegistrationFormUniqueEmail`` validates uniqueness + of email addresses. + + """ + # Create a user so we can verify that duplicate addresses + # aren't permitted. + User.objects.create_user('alice', 'alice@example.com', 'secret') + + form = forms.RegistrationFormUniqueEmail(data={'username': 'foo', + 'email': 'alice@example.com', + 'password1': 'foo', + 'password2': 'foo'}) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['email'], + [u"This email address is already in use. Please supply a different email address."]) + + form = forms.RegistrationFormUniqueEmail(data={'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo'}) + self.failUnless(form.is_valid()) + + def test_registration_form_no_free_email(self): + """ + Test that ``RegistrationFormNoFreeEmail`` disallows + registration with free email addresses. + + """ + base_data = {'username': 'foo', + 'password1': 'foo', + 'password2': 'foo'} + for domain in forms.RegistrationFormNoFreeEmail.bad_domains: + invalid_data = base_data.copy() + invalid_data['email'] = u"foo@%s" % domain + form = forms.RegistrationFormNoFreeEmail(data=invalid_data) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['email'], + [u"Registration using free email addresses is prohibited. Please supply a different email address."]) + + base_data['email'] = 'foo@example.com' + form = forms.RegistrationFormNoFreeEmail(data=base_data) + self.failUnless(form.is_valid()) diff --git a/registration/tests/models.py b/registration/tests/models.py new file mode 100644 index 00000000..f763cb2c --- /dev/null +++ b/registration/tests/models.py @@ -0,0 +1,225 @@ +import datetime +import re + +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.sites.models import Site +from django.core import mail +from django.core import management +from django.test import TestCase +from django.utils.hashcompat import sha_constructor + +from registration.models import RegistrationProfile + + +class RegistrationModelTests(TestCase): + """ + Test the model and manager used in the default backend. + + """ + user_info = {'username': 'alice', + 'password': 'swordfish', + 'email': 'alice@example.com'} + + def setUp(self): + self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None) + settings.ACCOUNT_ACTIVATION_DAYS = 7 + + def tearDown(self): + settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation + + def test_profile_creation(self): + """ + Creating a registration profile for a user populates the + profile with the correct user and a SHA1 hash to use as + activation key. + + """ + new_user = User.objects.create_user(**self.user_info) + profile = RegistrationProfile.objects.create_profile(new_user) + + self.assertEqual(RegistrationProfile.objects.count(), 1) + self.assertEqual(profile.user.id, new_user.id) + self.failUnless(re.match('^[a-f0-9]{40}$', profile.activation_key)) + self.assertEqual(unicode(profile), + "Registration information for alice") + + def test_activation_email(self): + """ + ``RegistrationProfile.send_activation_email`` sends an + email. + + """ + new_user = User.objects.create_user(**self.user_info) + profile = RegistrationProfile.objects.create_profile(new_user) + profile.send_activation_email(Site.objects.get_current()) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].to, [self.user_info['email']]) + + def test_user_creation(self): + """ + Creating a new user populates the correct data, and sets the + user's account inactive. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + self.assertEqual(new_user.username, 'alice') + self.assertEqual(new_user.email, 'alice@example.com') + self.failUnless(new_user.check_password('swordfish')) + self.failIf(new_user.is_active) + + def test_user_creation_email(self): + """ + By default, creating a new user sends an activation email. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + self.assertEqual(len(mail.outbox), 1) + + def test_user_creation_no_email(self): + """ + Passing ``send_email=False`` when creating a new user will not + send an activation email. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + send_email=False, + **self.user_info) + self.assertEqual(len(mail.outbox), 0) + + def test_unexpired_account(self): + """ + ``RegistrationProfile.activation_key_expired()`` is ``False`` + within the activation window. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + profile = RegistrationProfile.objects.get(user=new_user) + self.failIf(profile.activation_key_expired()) + + def test_expired_account(self): + """ + ``RegistrationProfile.activation_key_expired()`` is ``True`` + outside the activation window. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1) + new_user.save() + profile = RegistrationProfile.objects.get(user=new_user) + self.failUnless(profile.activation_key_expired()) + + def test_valid_activation(self): + """ + Activating a user within the permitted window makes the + account active, and resets the activation key. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + profile = RegistrationProfile.objects.get(user=new_user) + activated = RegistrationProfile.objects.activate_user(profile.activation_key) + + self.failUnless(isinstance(activated, User)) + self.assertEqual(activated.id, new_user.id) + self.failUnless(activated.is_active) + + profile = RegistrationProfile.objects.get(user=new_user) + self.assertEqual(profile.activation_key, RegistrationProfile.ACTIVATED) + + def test_expired_activation(self): + """ + Attempting to activate outside the permitted window does not + activate the account. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1) + new_user.save() + + profile = RegistrationProfile.objects.get(user=new_user) + activated = RegistrationProfile.objects.activate_user(profile.activation_key) + + self.failIf(isinstance(activated, User)) + self.failIf(activated) + + new_user = User.objects.get(username='alice') + self.failIf(new_user.is_active) + + profile = RegistrationProfile.objects.get(user=new_user) + self.assertNotEqual(profile.activation_key, RegistrationProfile.ACTIVATED) + + def test_activation_invalid_key(self): + """ + Attempting to activate with a key which is not a SHA1 hash + fails. + + """ + self.failIf(RegistrationProfile.objects.activate_user('foo')) + + def test_activation_already_activated(self): + """ + Attempting to re-activate an already-activated account fails. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + profile = RegistrationProfile.objects.get(user=new_user) + RegistrationProfile.objects.activate_user(profile.activation_key) + + profile = RegistrationProfile.objects.get(user=new_user) + self.failIf(RegistrationProfile.objects.activate_user(profile.activation_key)) + + def test_activation_nonexistent_key(self): + """ + Attempting to activate with a non-existent key (i.e., one not + associated with any account) fails. + + """ + # Due to the way activation keys are constructed during + # registration, this will never be a valid key. + invalid_key = sha_constructor('foo').hexdigest() + self.failIf(RegistrationProfile.objects.activate_user(invalid_key)) + + def test_expired_user_deletion(self): + """ + ``RegistrationProfile.objects.delete_expired_users()`` only + deletes inactive users whose activation window has expired. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + username='bob', + password='secret', + email='bob@example.com') + expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1) + expired_user.save() + + RegistrationProfile.objects.delete_expired_users() + self.assertEqual(RegistrationProfile.objects.count(), 1) + self.assertRaises(User.DoesNotExist, User.objects.get, username='bob') + + def test_management_command(self): + """ + The ``cleanupregistration`` management command properly + deletes expired accounts. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + **self.user_info) + expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(), + username='bob', + password='secret', + email='bob@example.com') + expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1) + expired_user.save() + + management.call_command('cleanupregistration') + self.assertEqual(RegistrationProfile.objects.count(), 1) + self.assertRaises(User.DoesNotExist, User.objects.get, username='bob') diff --git a/registration/tests/simple_backend.py b/registration/tests/simple_backend.py new file mode 100644 index 00000000..fe61079f --- /dev/null +++ b/registration/tests/simple_backend.py @@ -0,0 +1,89 @@ +from django.conf import settings +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.test import TestCase + +from registration.forms import RegistrationForm + + +class SimpleBackendViewTests(TestCase): + urls = 'registration.backends.simple.urls' + + def test_allow(self): + """ + The setting ``REGISTRATION_OPEN`` appropriately controls + whether registration is permitted. + + """ + old_allowed = getattr(settings, 'REGISTRATION_OPEN', True) + settings.REGISTRATION_OPEN = True + + resp = self.client.get(reverse('registration_register')) + self.assertEqual(200, resp.status_code) + + settings.REGISTRATION_OPEN = False + + # Now all attempts to hit the register view should redirect to + # the 'registration is closed' message. + resp = self.client.get(reverse('registration_register')) + self.assertRedirects(resp, reverse('registration_disallowed')) + + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + self.assertRedirects(resp, reverse('registration_disallowed')) + + settings.REGISTRATION_OPEN = old_allowed + + def test_registration_get(self): + """ + HTTP ``GET`` to the registration view uses the appropriate + template and populates a registration form into the context. + + """ + resp = self.client.get(reverse('registration_register')) + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, + 'registration/registration_form.html') + self.failUnless(isinstance(resp.context['form'], + RegistrationForm)) + + def test_registration(self): + """ + Registration creates a new account and logs the user in. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'secret'}) + + new_user = User.objects.get(username='bob') + self.assertEqual(302, resp.status_code) + self.failUnless(new_user.get_absolute_url() in resp['Location']) + + self.failUnless(new_user.check_password('secret')) + self.assertEqual(new_user.email, 'bob@example.com') + + # New user must be active. + self.failUnless(new_user.is_active) + + # New user must be logged in. + resp = self.client.get(reverse('registration_register')) + self.failUnless(resp.context['user'].is_authenticated()) + + def test_registration_failure(self): + """ + Registering with invalid data fails. + + """ + resp = self.client.post(reverse('registration_register'), + data={'username': 'bob', + 'email': 'bob@example.com', + 'password1': 'secret', + 'password2': 'notsecret'}) + self.assertEqual(200, resp.status_code) + self.failIf(resp.context['form'].is_valid()) diff --git a/registration/tests/urls.py b/registration/tests/urls.py new file mode 100644 index 00000000..02ef6090 --- /dev/null +++ b/registration/tests/urls.py @@ -0,0 +1,82 @@ +""" +URLs used in the unit tests for django-registration. + +You should not attempt to use these URLs in any sort of real or +development environment; instead, use +``registration/backends/default/urls.py``. This URLconf includes those +URLs, and also adds several additional URLs which serve no purpose +other than to test that optional keyword arguments are properly +handled. + +""" + +from django.conf.urls.defaults import * +from django.views.generic.simple import direct_to_template + +from registration.views import activate +from registration.views import register + + +urlpatterns = patterns('', + # Test the 'activate' view with custom template + # name. + url(r'^activate-with-template-name/(?P\w+)/$', + activate, + {'template_name': 'registration/test_template_name.html', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_template_name'), + # Test the 'activate' view with + # extra_context_argument. + url(r'^activate-extra-context/(?P\w+)/$', + activate, + {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_extra_context'), + # Test the 'activate' view with success_url argument. + url(r'^activate-with-success-url/(?P\w+)/$', + activate, + {'success_url': 'registration_test_custom_success_url', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_success_url'), + # Test the 'register' view with custom template + # name. + url(r'^register-with-template-name/$', + register, + {'template_name': 'registration/test_template_name.html', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_template_name'), + # Test the'register' view with extra_context + # argument. + url(r'^register-extra-context/$', + register, + {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_extra_context'), + # Test the 'register' view with custom URL for + # closed registration. + url(r'^register-with-disallowed-url/$', + register, + {'disallowed_url': 'registration_test_custom_disallowed', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_disallowed_url'), + # Set up a pattern which will correspond to the + # custom 'disallowed_url' above. + url(r'^custom-disallowed/$', + direct_to_template, + {'template': 'registration/registration_closed.html'}, + name='registration_test_custom_disallowed'), + # Test the 'register' view with custom redirect + # on successful registration. + url(r'^register-with-success_url/$', + register, + {'success_url': 'registration_test_custom_success_url', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_success_url' + ), + # Pattern for custom redirect set above. + url(r'^custom-success/$', + direct_to_template, + {'template': 'registration/test_template_name.html'}, + name='registration_test_custom_success_url'), + (r'', include('registration.backends.default.urls')), + ) diff --git a/registration/urls.py b/registration/urls.py new file mode 100644 index 00000000..8579f75b --- /dev/null +++ b/registration/urls.py @@ -0,0 +1,15 @@ +""" +Backwards-compatible URLconf for existing django-registration +installs; this allows the standard ``include('registration.urls')`` to +continue working, but that usage is deprecated and will be removed for +django-registration 1.0. For new installs, use +``include('registration.backends.default.urls')``. + +""" + +import warnings + +warnings.warn("include('registration.urls') is deprecated; use include('registration.backends.default.urls') instead.", + DeprecationWarning) + +from registration.backends.default.urls import * diff --git a/registration/views.py b/registration/views.py new file mode 100644 index 00000000..07bc54dc --- /dev/null +++ b/registration/views.py @@ -0,0 +1,142 @@ +""" +Views which allow users to create and activate accounts. + +""" + +from django.shortcuts import redirect +from django.views.generic.base import TemplateView +from django.views.generic.edit import FormView + +from registration import signals +from registration.forms import RegistrationForm, RegistrationFormUniqueEmail + + +class _RequestPassingFormView(FormView): + """ + A version of FormView which passes extra arguments to certain + methods, notably passing the HTTP request nearly everywhere, to + enable finer-grained processing. + + """ + def get(self, request, *args, **kwargs): + # Pass request to get_form_class and get_form for per-request + # form control. + form_class = self.get_form_class(request) + form = self.get_form(form_class) + return self.render_to_response(self.get_context_data(form=form)) + + def post(self, request, *args, **kwargs): + # Pass request to get_form_class and get_form for per-request + # form control. + form_class = self.get_form_class(request) + form = self.get_form(form_class) + if form.is_valid(): + # Pass request to form_valid. + return self.form_valid(request, form) + else: + return self.form_invalid(form) + + def get_form_class(self, request=None): + return super(_RequestPassingFormView, self).get_form_class() + + def get_form_kwargs(self, request=None, form_class=None): + return super(_RequestPassingFormView, self).get_form_kwargs() + + def get_initial(self, request=None): + return super(_RequestPassingFormView, self).get_initial() + + def get_success_url(self, request=None, user=None): + # We need to be able to use the request and the new user when + # constructing success_url. + return super(_RequestPassingFormView, self).get_success_url() + + def form_valid(self, form, request=None): + return super(_RequestPassingFormView, self).form_valid(form) + + def form_invalid(self, form, request=None): + return super(_RequestPassingFormView, self).form_invalid(form) + + +class RegistrationView(_RequestPassingFormView): + """ + Base class for user registration views. + + """ + disallowed_url = 'registration_disallowed' + form_class = RegistrationFormUniqueEmail + http_method_names = ['get', 'post', 'head', 'options', 'trace'] + success_url = None + template_name = 'registration/registration_form.html' + + def dispatch(self, request, *args, **kwargs): + """ + Check that user signup is allowed before even bothering to + dispatch or do other processing. + + """ + if not self.registration_allowed(request): + return redirect(self.disallowed_url) + return super(RegistrationView, self).dispatch(request, *args, **kwargs) + + def form_valid(self, request, form): + new_user = self.register(request, **form.cleaned_data) + success_url = self.get_success_url(request, new_user) + + # success_url may be a simple string, or a tuple providing the + # full argument set for redirect(). Attempting to unpack it + # tells us which one it is. + try: + to, args, kwargs = success_url + return redirect(to, *args, **kwargs) + except ValueError: + return redirect(success_url) + + def registration_allowed(self, request): + """ + Override this to enable/disable user registration, either + globally or on a per-request basis. + + """ + return True + + def register(self, request, **cleaned_data): + """ + Implement user-registration logic here. Access to both the + request and the full cleaned_data of the registration form is + available here. + + """ + raise NotImplementedError + + +class ActivationView(TemplateView): + """ + Base class for user activation views. + + """ + http_method_names = ['get'] + template_name = 'registration/activate.html' + + def get(self, request, *args, **kwargs): + activated_user = self.activate(request, *args, **kwargs) + if activated_user: + signals.user_activated.send(sender=self.__class__, + user=activated_user, + request=request) + success_url = self.get_success_url(request, activated_user) + try: + to, args, kwargs = success_url + return redirect(to, *args, **kwargs) + except ValueError: + return redirect(success_url) + return super(ActivationView, self).get(request, *args, **kwargs) + + def activate(self, request, *args, **kwargs): + """ + Implement account-activation logic here. + + """ + raise NotImplementedError + + def get_success_url(self, request, user): + raise NotImplementedError diff --git a/templates/base.html b/templates/base.html index a7de2a24..c068db6a 100644 --- a/templates/base.html +++ b/templates/base.html @@ -148,6 +148,7 @@

  • Валюты
  • +
  • Зарегестрировать
    пользователя
  • diff --git a/templates/registration/activate.html b/templates/registration/activate.html new file mode 100644 index 00000000..cd424bed --- /dev/null +++ b/templates/registration/activate.html @@ -0,0 +1,16 @@ +{% extends "registration/base.html" %} + +{% block title %}Account activated{% endblock %} + +{% block content %} +

    Account activated.

    + {% load humanize %} + {% if account %} +

    Thanks for signing up! Now you can log in.

    + {% else %} +

    Sorry, it didn't work. Either your activation link was incorrect, or + the activation key for your account has expired; activation keys are + only valid for {{ expiration_days|apnumber }} days after + registration.

    + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activation_complete.html b/templates/registration/activation_complete.html new file mode 100644 index 00000000..b47a03fc --- /dev/null +++ b/templates/registration/activation_complete.html @@ -0,0 +1,8 @@ +{% extends "registration/base.html" %} + +{% block title %}Activation complete{% endblock %} + +{% block content %} +

    Congratulations!

    +

    Your registration is now complete. Go to the site and start having fun!

    +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt new file mode 100644 index 00000000..4a523809 --- /dev/null +++ b/templates/registration/activation_email.txt @@ -0,0 +1,6 @@ + +Someone, hopefully you, signed up for a new account at djangoproject.com using this email address. If it was you, and you'd like to activate and use your account, click the link below or copy and paste it into your web browser's address bar: + +http://127.0.0.1:8000/accounts/activate/{{ activation_key }}/ + +If you didn't request this, you don't need to do anything; you won't receive any more email from us, and the account will expire automatically in {{ expiration_days }} days. diff --git a/templates/registration/activation_email_subject.txt b/templates/registration/activation_email_subject.txt new file mode 100644 index 00000000..8ec5ec44 --- /dev/null +++ b/templates/registration/activation_email_subject.txt @@ -0,0 +1 @@ +Activate your djangoproject.com account - you have {{ expiration_days }} days! diff --git a/templates/registration/base.html b/templates/registration/base.html new file mode 100644 index 00000000..b1398a38 --- /dev/null +++ b/templates/registration/base.html @@ -0,0 +1,23 @@ + + + + + {% block title %}Tagging Exploration{% endblock %} + + + + + +
    + {% block content %}{% endblock %} + {% block main_content %}{% endblock %} +
    + + \ No newline at end of file diff --git a/templates/registration/login.html b/templates/registration/login.html new file mode 100644 index 00000000..3c8279d3 --- /dev/null +++ b/templates/registration/login.html @@ -0,0 +1,27 @@ +{% extends "registration/base.html" %} + +{% block title %}Log in{% endblock %} + +{% block content %} + +

    Log in

    + +{% if form.errors %} +

    Please correct the errors below:

    +{% endif %} + +
    {% csrf_token %} +
    +
    {% if form.username.errors %} {{ form.username.errors|join:", " }}{% endif %}
    +
    {{ form.username }}
    +
    {% if form.password.errors %} {{ form.password.errors|join:", " }}{% endif %}
    +
    {{ form.password }}
    +
    +
    +
    +{% endblock %} + +{% block content-related %} +

    If you don't have an account, you can sign +up for one. +{% endblock %} \ No newline at end of file diff --git a/templates/registration/login_error.html b/templates/registration/login_error.html new file mode 100644 index 00000000..e69de29b diff --git a/templates/registration/logout.html b/templates/registration/logout.html new file mode 100644 index 00000000..3275d2e1 --- /dev/null +++ b/templates/registration/logout.html @@ -0,0 +1,8 @@ +{% extends "registration/base.html" %} + +{% block title %}Logged out{% endblock %} + +{% block content %} +

    You've been logged out.

    +

    Thanks for stopping by; when you come back, don't forget to log in again.

    +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_change_done.html b/templates/registration/password_change_done.html new file mode 100644 index 00000000..0a2f3235 --- /dev/null +++ b/templates/registration/password_change_done.html @@ -0,0 +1,16 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block title %}{% trans 'Password change successful' %}{% endblock %} + +{% block content %} + +

    {% trans 'Password change successful' %}

    + +

    {% trans 'Your password was changed.' %}

    + +{% endblock %} + +{% block content-related %} + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_change_form.html b/templates/registration/password_change_form.html new file mode 100644 index 00000000..5986517b --- /dev/null +++ b/templates/registration/password_change_form.html @@ -0,0 +1,31 @@ + +{% extends "registration/base.html" %} +{% load i18n %} + +{% block title %} {% trans 'Password change' %} {% endblock %} + +{% block content %} + +

    {% trans 'Password change' %}

    + +

    {% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}

    + +
    +{% csrf_token %} +{{ form.old_password.errors }} +

    {{ form.old_password }}

    +{{ form.new_password1.errors }} +

    {{ form.new_password1 }}

    +{{ form.new_password2.errors }} +

    {{ form.new_password2 }}

    + +

    +
    + + + +{% endblock %} + +{% block content-related %} + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_reset_complete.html b/templates/registration/password_reset_complete.html new file mode 100755 index 00000000..4e55cc5e --- /dev/null +++ b/templates/registration/password_reset_complete.html @@ -0,0 +1,21 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumbs %}{% endblock %} + +{% block title %}{% trans 'Password reset complete' %}{% endblock %} + +{% block content %} + +

    {% trans 'Password reset complete' %}

    + +

    {% trans "Your password has been set. You may go ahead and log in now." %}

    + +

    {% trans 'Log in' %}

    + +{% endblock %} + + +{% block content-related %} + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_reset_confirm.html b/templates/registration/password_reset_confirm.html new file mode 100755 index 00000000..957eca04 --- /dev/null +++ b/templates/registration/password_reset_confirm.html @@ -0,0 +1,33 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumbs %}{% endblock %} + +{% block title %}{% trans 'Password reset' %}{% endblock %} + +{% block content %} + +{% if validlink %} + +

    {% trans 'Enter new password' %}

    + +

    {% trans "Please enter your new password twice so we can verify you typed it in correctly." %}

    + +
    + {% csrf_token %} +{{ form.new_password1.errors }} +

    {{ form.new_password1 }}

    +{{ form.new_password2.errors }} +

    {{ form.new_password2 }}

    +

    +
    + +{% else %} + +

    {% trans 'Password reset unsuccessful' %}

    + +

    {% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    + +{% endif %} + +{% endblock %} diff --git a/templates/registration/password_reset_done.html b/templates/registration/password_reset_done.html new file mode 100755 index 00000000..637ed888 --- /dev/null +++ b/templates/registration/password_reset_done.html @@ -0,0 +1,14 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumbs %}{% endblock %} + +{% block title %}{% trans 'Password reset successful' %}{% endblock %} + +{% block content %} + +

    {% trans 'Password reset successful' %}

    + +

    {% trans "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." %}

    + +{% endblock %} diff --git a/templates/registration/password_reset_email.html b/templates/registration/password_reset_email.html new file mode 100755 index 00000000..4405ae22 --- /dev/null +++ b/templates/registration/password_reset_email.html @@ -0,0 +1,15 @@ +{% load i18n %}{% autoescape off %} +{% trans "You're receiving this e-mail because you requested a password reset" %} +{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}. + +{% trans "Please go to the following page and choose a new password:" %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb36=uid token=token %} +{% endblock %} +{% trans "Your username, in case you've forgotten:" %} {{ user.username }} + +{% trans "Thanks for using our site!" %} + +{% blocktrans %}The {{ site_name }} team{% endblocktrans %} + +{% endautoescape %} diff --git a/templates/registration/password_reset_form.html b/templates/registration/password_reset_form.html new file mode 100755 index 00000000..ae162b8e --- /dev/null +++ b/templates/registration/password_reset_form.html @@ -0,0 +1,20 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumbs %}{% endblock %} + +{% block title %}{% trans "Password reset" %}{% endblock %} + +{% block content %} + +

    {% trans "Password reset" %}

    + +

    {% trans "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one." %}

    + +
    + {% csrf_token %} +{{ form.email.errors }} +

    {{ form.email }}

    +
    + +{% endblock %} diff --git a/templates/registration/registration_complete.html b/templates/registration/registration_complete.html new file mode 100644 index 00000000..9f0cea41 --- /dev/null +++ b/templates/registration/registration_complete.html @@ -0,0 +1,8 @@ +{% extends "registration/base.html" %} + +{% block title %}Registration complete{% endblock %} + +{% block content %} +

    Check your email

    +

    An activation link has been sent to the email address you supplied, along with instructions for activating your account.

    +{% endblock %} \ No newline at end of file diff --git a/templates/registration/registration_form.html b/templates/registration/registration_form.html new file mode 100644 index 00000000..fffba8cc --- /dev/null +++ b/templates/registration/registration_form.html @@ -0,0 +1,65 @@ +{% extends "registration/base.html" %} + +{% block title %}Sign up{% endblock %} + +{% block content %} + + {% if form.errors %} +

    Please correct the errors below: {{ form.non_field_errors }}

    + {% endif %} + +

    Create an account

    + +
    + {% csrf_token %} +

    + + {% if form.first_name.errors %} +

    {{ form.first_name.errors.as_text }}

    + {% endif %} + {{ form.first_name }} +

    +

    + + {% if form.last_name.errors %} +

    {{ form.last_name.errors.as_text }}

    + {% endif %} + {{ form.last_name }} +

    +

    + + {% if form.email.errors %} +

    {{ form.email.errors.as_text }}

    + {% endif %} + {{ form.email }} +

    +

    + + {% if form.password1.errors %} +

    {{ form.password1.errors.as_text }}

    + {% endif %} + {{ form.password1 }} +

    +

    + + {% if form.password2.errors %} +

    {{ form.password2.errors.as_text }}

    + {% endif %} + {{ form.password2 }} +

    +

    +
    + +{% endblock %} + +{% block content-related %} +

    Fill out the form to the left (all fields are required), and your +account will be created; you'll be sent an email with instructions on how +to finish your registration.

    + +

    We'll only use your email to send you signup instructions. We hate spam +as much as you do.

    + +

    This account will let you log into the ticket tracker, claim tickets, +and be exempt from spam filtering.

    +{% endblock %}