summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-31 21:04:04 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-31 21:04:04 -0400
commitd0406081233fb7784d5b006fb182e6fdc92560ba (patch)
tree61a61dbf24b91d4e4162504d7bd065f8fb963b8e
parentcfc5cf4e2cc2a1cc21d935fd70d545285844f7ad (diff)
downloadaskbot-d0406081233fb7784d5b006fb182e6fdc92560ba.tar.gz
askbot-d0406081233fb7784d5b006fb182e6fdc92560ba.tar.bz2
askbot-d0406081233fb7784d5b006fb182e6fdc92560ba.zip
multiple login methods work, but need better testing
-rw-r--r--askbot/__init__.py1
-rw-r--r--askbot/deps/django_authopenid/migrations/0001_initial.py171
-rw-r--r--askbot/deps/django_authopenid/migrations/0002_make_multiple_openids_possible.py128
-rw-r--r--askbot/deps/django_authopenid/migrations/0003_fill_in_provider_names.py116
-rw-r--r--askbot/deps/django_authopenid/migrations/__init__.py0
-rw-r--r--askbot/deps/django_authopenid/models.py9
-rw-r--r--askbot/deps/django_authopenid/util.py9
-rw-r--r--askbot/deps/django_authopenid/views.py47
-rw-r--r--askbot/importers/stackexchange/management/commands/load_stackexchange.py2
-rw-r--r--askbot/locale/en/LC_MESSAGES/django.mobin25486 -> 24987 bytes
-rw-r--r--askbot/locale/en/LC_MESSAGES/django.po1044
-rwxr-xr-xaskbot/skins/default/templates/authopenid/signin.html2
12 files changed, 1088 insertions, 441 deletions
diff --git a/askbot/__init__.py b/askbot/__init__.py
index ce0341d7..d27f7f7c 100644
--- a/askbot/__init__.py
+++ b/askbot/__init__.py
@@ -6,6 +6,7 @@ basic actions on behalf of the forum application
"""
import os
import smtplib
+import logging
from django.core import mail
from django.conf import settings as django_settings
from askbot import exceptions
diff --git a/askbot/deps/django_authopenid/migrations/0001_initial.py b/askbot/deps/django_authopenid/migrations/0001_initial.py
new file mode 100644
index 00000000..2be0ffb7
--- /dev/null
+++ b/askbot/deps/django_authopenid/migrations/0001_initial.py
@@ -0,0 +1,171 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'Nonce'
+ db.create_table('django_authopenid_nonce', (
+ ('timestamp', self.gf('django.db.models.fields.IntegerField')()),
+ ('salt', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('server_url', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ))
+ db.send_create_signal('django_authopenid', ['Nonce'])
+
+ # Adding model 'Association'
+ db.create_table('django_authopenid_association', (
+ ('handle', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('issued', self.gf('django.db.models.fields.IntegerField')()),
+ ('server_url', self.gf('django.db.models.fields.TextField')(max_length=2047)),
+ ('assoc_type', self.gf('django.db.models.fields.TextField')(max_length=64)),
+ ('secret', self.gf('django.db.models.fields.TextField')(max_length=255)),
+ ('lifetime', self.gf('django.db.models.fields.IntegerField')()),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ))
+ db.send_create_signal('django_authopenid', ['Association'])
+
+ # Adding model 'UserAssociation'
+ db.create_table('django_authopenid_userassociation', (
+ ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('openid_url', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ))
+ db.send_create_signal('django_authopenid', ['UserAssociation'])
+
+ # Adding model 'UserPasswordQueue'
+ db.create_table('django_authopenid_userpasswordqueue', (
+ ('new_password', self.gf('django.db.models.fields.CharField')(max_length=30)),
+ ('confirm_key', self.gf('django.db.models.fields.CharField')(max_length=40)),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)),
+ ))
+ db.send_create_signal('django_authopenid', ['UserPasswordQueue'])
+
+ # Adding model 'ExternalLoginData'
+ db.create_table('django_authopenid_externallogindata', (
+ ('external_username', self.gf('django.db.models.fields.CharField')(unique=True, max_length=40)),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('external_session_data', self.gf('django.db.models.fields.TextField')()),
+ ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)),
+ ))
+ db.send_create_signal('django_authopenid', ['ExternalLoginData'])
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'Nonce'
+ db.delete_table('django_authopenid_nonce')
+
+ # Deleting model 'Association'
+ db.delete_table('django_authopenid_association')
+
+ # Deleting model 'UserAssociation'
+ db.delete_table('django_authopenid_userassociation')
+
+ # Deleting model 'UserPasswordQueue'
+ db.delete_table('django_authopenid_userpasswordqueue')
+
+ # Deleting model 'ExternalLoginData'
+ db.delete_table('django_authopenid_externallogindata')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}),
+ 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}),
+ 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
+ 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}),
+ 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'django_authopenid.association': {
+ 'Meta': {'object_name': 'Association'},
+ 'assoc_type': ('django.db.models.fields.TextField', [], {'max_length': '64'}),
+ 'handle': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issued': ('django.db.models.fields.IntegerField', [], {}),
+ 'lifetime': ('django.db.models.fields.IntegerField', [], {}),
+ 'secret': ('django.db.models.fields.TextField', [], {'max_length': '255'}),
+ 'server_url': ('django.db.models.fields.TextField', [], {'max_length': '2047'})
+ },
+ 'django_authopenid.externallogindata': {
+ 'Meta': {'object_name': 'ExternalLoginData'},
+ 'external_session_data': ('django.db.models.fields.TextField', [], {}),
+ 'external_username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
+ },
+ 'django_authopenid.nonce': {
+ 'Meta': {'object_name': 'Nonce'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'salt': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'server_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'timestamp': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'django_authopenid.userassociation': {
+ 'Meta': {'object_name': 'UserAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'openid_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+ },
+ 'django_authopenid.userpasswordqueue': {
+ 'Meta': {'object_name': 'UserPasswordQueue'},
+ 'confirm_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'new_password': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+ }
+ }
+
+ complete_apps = ['django_authopenid']
diff --git a/askbot/deps/django_authopenid/migrations/0002_make_multiple_openids_possible.py b/askbot/deps/django_authopenid/migrations/0002_make_multiple_openids_possible.py
new file mode 100644
index 00000000..4e615e65
--- /dev/null
+++ b/askbot/deps/django_authopenid/migrations/0002_make_multiple_openids_possible.py
@@ -0,0 +1,128 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'UserAssociation.provider_name'
+ db.add_column('django_authopenid_userassociation', 'provider_name', self.gf('django.db.models.fields.CharField')(default='unknown', max_length=64), keep_default=False)
+
+ # Removing unique constraint on 'UserAssociation', fields ['user']
+ db.delete_unique('django_authopenid_userassociation', ['user_id'])
+
+ # Adding unique constraint on 'UserAssociation', fields ['provider_name', 'user']
+ db.create_unique('django_authopenid_userassociation', ['provider_name', 'user_id'])
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'UserAssociation.provider_name'
+ db.delete_column('django_authopenid_userassociation', 'provider_name')
+
+ # Adding unique constraint on 'UserAssociation', fields ['user']
+ db.create_unique('django_authopenid_userassociation', ['user_id'])
+
+ # Removing unique constraint on 'UserAssociation', fields ['provider_name', 'user']
+ db.delete_unique('django_authopenid_userassociation', ['provider_name', 'user_id'])
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}),
+ 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}),
+ 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
+ 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}),
+ 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'django_authopenid.association': {
+ 'Meta': {'object_name': 'Association'},
+ 'assoc_type': ('django.db.models.fields.TextField', [], {'max_length': '64'}),
+ 'handle': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issued': ('django.db.models.fields.IntegerField', [], {}),
+ 'lifetime': ('django.db.models.fields.IntegerField', [], {}),
+ 'secret': ('django.db.models.fields.TextField', [], {'max_length': '255'}),
+ 'server_url': ('django.db.models.fields.TextField', [], {'max_length': '2047'})
+ },
+ 'django_authopenid.externallogindata': {
+ 'Meta': {'object_name': 'ExternalLoginData'},
+ 'external_session_data': ('django.db.models.fields.TextField', [], {}),
+ 'external_username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
+ },
+ 'django_authopenid.nonce': {
+ 'Meta': {'object_name': 'Nonce'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'salt': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'server_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'timestamp': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'django_authopenid.userassociation': {
+ 'Meta': {'unique_together': "(('user', 'provider_name'),)", 'object_name': 'UserAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'openid_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'provider_name': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '64'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'django_authopenid.userpasswordqueue': {
+ 'Meta': {'object_name': 'UserPasswordQueue'},
+ 'confirm_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'new_password': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+ }
+ }
+
+ complete_apps = ['django_authopenid']
diff --git a/askbot/deps/django_authopenid/migrations/0003_fill_in_provider_names.py b/askbot/deps/django_authopenid/migrations/0003_fill_in_provider_names.py
new file mode 100644
index 00000000..d86dc7d2
--- /dev/null
+++ b/askbot/deps/django_authopenid/migrations/0003_fill_in_provider_names.py
@@ -0,0 +1,116 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+from askbot.deps.django_authopenid import util
+
+class Migration(DataMigration):
+
+ def forwards(self, orm):
+ "determines openid provider from url"
+ for assoc in orm.UserAssociation.objects.all():
+ assoc.provider_name = util.get_provider_name(assoc.openid_url)
+ print '%s -> %s' % (assoc.user.username, assoc.provider_name)
+ assoc.save()
+
+ def backwards(self, orm):
+ "Backwards migration is irrelevant here"
+ pass
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}),
+ 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}),
+ 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
+ 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}),
+ 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'django_authopenid.association': {
+ 'Meta': {'object_name': 'Association'},
+ 'assoc_type': ('django.db.models.fields.TextField', [], {'max_length': '64'}),
+ 'handle': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'issued': ('django.db.models.fields.IntegerField', [], {}),
+ 'lifetime': ('django.db.models.fields.IntegerField', [], {}),
+ 'secret': ('django.db.models.fields.TextField', [], {'max_length': '255'}),
+ 'server_url': ('django.db.models.fields.TextField', [], {'max_length': '2047'})
+ },
+ 'django_authopenid.externallogindata': {
+ 'Meta': {'object_name': 'ExternalLoginData'},
+ 'external_session_data': ('django.db.models.fields.TextField', [], {}),
+ 'external_username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
+ },
+ 'django_authopenid.nonce': {
+ 'Meta': {'object_name': 'Nonce'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'salt': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'server_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'timestamp': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'django_authopenid.userassociation': {
+ 'Meta': {'unique_together': "(('user', 'provider_name'),)", 'object_name': 'UserAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'openid_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'provider_name': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '64'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'django_authopenid.userpasswordqueue': {
+ 'Meta': {'object_name': 'UserPasswordQueue'},
+ 'confirm_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'new_password': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+ }
+ }
+
+ complete_apps = ['django_authopenid']
diff --git a/askbot/deps/django_authopenid/migrations/__init__.py b/askbot/deps/django_authopenid/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/askbot/deps/django_authopenid/migrations/__init__.py
diff --git a/askbot/deps/django_authopenid/models.py b/askbot/deps/django_authopenid/models.py
index a12c2fec..90a22487 100644
--- a/askbot/deps/django_authopenid/models.py
+++ b/askbot/deps/django_authopenid/models.py
@@ -35,7 +35,14 @@ class UserAssociation(models.Model):
model to manage association between openid and user
"""
openid_url = models.CharField(blank=False, max_length=255)
- user = models.ForeignKey(User, unique=True)
+ user = models.ForeignKey(User)
+ #in the future this must be turned into an
+ #association with a Provider record
+ #to hold things like login badge, etc
+ provider_name = models.CharField(max_length=64, default='unknown')
+
+ class Meta(object):
+ unique_together = (('user','provider_name'),)
def __unicode__(self):
return "Openid %s with user %s" % (self.openid_url, self.user)
diff --git a/askbot/deps/django_authopenid/util.py b/askbot/deps/django_authopenid/util.py
index 7de38d79..977311ae 100644
--- a/askbot/deps/django_authopenid/util.py
+++ b/askbot/deps/django_authopenid/util.py
@@ -133,3 +133,12 @@ def from_openid_response(openid_response):
openid_response.identity_url, issued, openid_response.signed_fields,
dict(sreg_resp)
)
+
+def get_provider_name(openid_url):
+ """returns provider name from the openid_url
+ """
+ openid_str = openid_url
+ bits = openid_str.split('/')
+ base_url = bits[2] #assume this is base url
+ url_bits = base_url.split('.')
+ return url_bits[-2].lower()
diff --git a/askbot/deps/django_authopenid/views.py b/askbot/deps/django_authopenid/views.py
index 2666d6c5..5d3ba147 100644
--- a/askbot/deps/django_authopenid/views.py
+++ b/askbot/deps/django_authopenid/views.py
@@ -62,7 +62,7 @@ import re
import urllib
from askbot import forms as askbot_forms
-from askbot.deps.django_authopenid.util import OpenID, DjangoOpenIDStore, from_openid_response
+from askbot.deps.django_authopenid import util
from askbot.deps.django_authopenid.models import UserAssociation, UserPasswordQueue, ExternalLoginData
from askbot.deps.django_authopenid import forms
import logging
@@ -140,7 +140,7 @@ def ask_openid(
msg = _("i-names are not supported")
logging.debug('openid failed because i-names are not supported')
return on_failure(request, msg)
- consumer = Consumer(request.session, DjangoOpenIDStore())
+ consumer = Consumer(request.session, util.DjangoOpenIDStore())
try:
auth_request = consumer.begin(openid_url)
except DiscoveryFailure:
@@ -163,7 +163,7 @@ def complete(request, on_success=None, on_failure=None, return_to=None):
logging.debug('in askbot.deps.django_authopenid.complete')
- consumer = Consumer(request.session, DjangoOpenIDStore())
+ consumer = Consumer(request.session, util.DjangoOpenIDStore())
# make sure params are encoded in utf8
params = dict((k,smart_unicode(v)) for k, v in request.GET.items())
openid_response = consumer.complete(params, return_to)
@@ -188,7 +188,7 @@ def complete(request, on_success=None, on_failure=None, return_to=None):
def default_on_success(request, identity_url, openid_response):
""" default action on openid signin success """
logging.debug('')
- request.session['openid'] = from_openid_response(openid_response)
+ request.session['openid'] = util.from_openid_response(openid_response)
logging.debug('performing default action on openid success %s' % get_next_url(request))
return HttpResponseRedirect(get_next_url(request))
@@ -450,13 +450,15 @@ def signin_success(request, identity_url, openid_response):
"""
logging.debug('')
- openid_ = from_openid_response(openid_response) #create janrain OpenID object
+ openid_ = util.from_openid_response(openid_response) #create janrain OpenID object
request.session['openid'] = openid_
try:
logging.debug('trying to get user associated with this openid...')
rel = UserAssociation.objects.get(openid_url__exact = str(openid_))
+ print 'have openid, and logged in - success'
logging.debug('success')
if request.user.is_authenticated() and rel.user != request.user:
+ print 'stealing openid'
logging.critical(
'possible account theft attempt by %s,%d to %s %d' % \
(
@@ -470,23 +472,42 @@ def signin_success(request, identity_url, openid_response):
else:
logging.debug('success')
except UserAssociation.DoesNotExist:
+ print 'openid %s not found' % str(openid_)
if request.user.is_anonymous():
+ print 'registering new user, because he is anonymous'
logging.debug('failed --> try to register brand new user')
# try to register this new user
return register(request)
else:
#store openid association
+ provider_name = util.get_provider_name(str(openid_))
try:
- user_assoc = UserAssociation.objects.get(user = request.user)
+ print 'recovering association via user and provider name'
+ user_assoc = UserAssociation.objects.get(
+ user = request.user,
+ provider_name = provider_name
+ )
+ print 'have %s replacing with new' % user_assoc.openid_url
user_assoc.openid_url = str(openid_)
+ #association changed
except UserAssociation.DoesNotExist:
+ print 'creating a brand new association with this openid'
user_assoc = UserAssociation(
user = request.user,
- openid_url = openid_
+ openid_url = str(openid_),
+ provider_name = provider_name
)
+ #new association created
+ except UserAssociation.MultipleObjectsReturned, error:
+ msg = 'user %s (id=%d) has > 1 %s logins' % \
+ (request.user.username, request.user.id, provider_name)
+ logging.critical(message)
+ raise error
+
user_assoc.save()
message = _('New login method saved. Thanks!')
request.user.message_set.create(message = message)
+ print message
#set "account recovered" message
return HttpResponseRedirect(get_next_url(request))
user_ = rel.user
@@ -615,11 +636,7 @@ def register(request):
logging.debug('have really strange error')
raise Exception('openid login failed')#should not ever get here
- openid_str = str(openid_)
- bits = openid_str.split('/')
- base_url = bits[2] #assume this is base url
- url_bits = base_url.split('.')
- provider_name = url_bits[-2].lower()
+ provider_name = util.get_provider_name(str(openid_))
providers = {'yahoo':'<font color="purple">Yahoo!</font>',
'flickr':'<font color="#0063dc">flick</font><font color="#ff0084">r</font>&trade;',
@@ -1047,7 +1064,7 @@ def changeemail(request, action='change'):
def emailopenid_success(request, identity_url, openid_response):
logging.debug('')
- openid_ = from_openid_response(openid_response)
+ openid_ = util.from_openid_response(openid_response)
user_ = request.user
try:
@@ -1126,7 +1143,7 @@ def changeopenid(request):
def changeopenid_success(request, identity_url, openid_response):
logging.error('never tested this worflow')
- openid_ = from_openid_response(openid_response)
+ openid_ = util.from_openid_response(openid_response)
is_exist = True
try:
uassoc = UserAssociation.objects.get(openid_url__exact=identity_url)
@@ -1205,7 +1222,7 @@ def delete(request):
def deleteopenid_success(request, identity_url, openid_response):
logging.error('never tested this')
- openid_ = from_openid_response(openid_response)
+ openid_ = util.from_openid_response(openid_response)
user_ = request.user
try:
diff --git a/askbot/importers/stackexchange/management/commands/load_stackexchange.py b/askbot/importers/stackexchange/management/commands/load_stackexchange.py
index 918a5046..852500b6 100644
--- a/askbot/importers/stackexchange/management/commands/load_stackexchange.py
+++ b/askbot/importers/stackexchange/management/commands/load_stackexchange.py
@@ -742,7 +742,9 @@ class Command(BaseCommand):
assert(se_u.open_id)#everybody must have open_id
u_openid = askbot_openid.UserAssociation()
u_openid.openid_url = se_u.open_id
+ u.save()
u_openid.user = u
+ u_openid.save()
except AssertionError:
print 'User %s (id=%d) does not have openid' % \
(se_u.display_name, se_u.id)
diff --git a/askbot/locale/en/LC_MESSAGES/django.mo b/askbot/locale/en/LC_MESSAGES/django.mo
index 892d2f27..39c2b011 100644
--- a/askbot/locale/en/LC_MESSAGES/django.mo
+++ b/askbot/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/askbot/locale/en/LC_MESSAGES/django.po b/askbot/locale/en/LC_MESSAGES/django.po
index 2ff3fe6a..0a29a579 100644
--- a/askbot/locale/en/LC_MESSAGES/django.po
+++ b/askbot/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-08-10 18:09-0500\n"
+"POT-Creation-Date: 2010-08-31 18:55-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Evgeny Fadeev <evgeny.fadeev@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,22 +16,6 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: auth.py:395
-msgid "Your question and all of it's answers have been deleted"
-msgstr ""
-
-#: auth.py:398
-msgid "Your question has been deleted"
-msgstr ""
-
-#: auth.py:402
-msgid "The question and all of it's answers have been deleted"
-msgstr ""
-
-#: auth.py:405
-msgid "The question has been deleted"
-msgstr ""
-
#: feed.py:22
msgid " - "
msgstr ""
@@ -40,220 +24,224 @@ msgstr ""
msgid "latest questions"
msgstr ""
-#: forms.py:47 skins/default/templates/answer_edit_tips.html:35
-#: skins/default/templates/answer_edit_tips.html:39
-#: skins/default/templates/question_edit_tips.html:32
-#: skins/default/templates/question_edit_tips.html:37
+#: forms.py:54 skins/default/templates/answer_edit_tips.html:45
+#: skins/default/templates/answer_edit_tips.html:49
+#: skins/default/templates/question_edit_tips.html:41
+#: skins/default/templates/question_edit_tips.html:46
msgid "title"
msgstr ""
-#: forms.py:48
+#: forms.py:55
msgid "please enter a descriptive title for your question"
msgstr ""
-#: forms.py:53
+#: forms.py:60
msgid "title must be > 10 characters"
msgstr ""
-#: forms.py:62
+#: forms.py:69
msgid "content"
msgstr ""
-#: forms.py:68
+#: forms.py:75
msgid "question content must be > 10 characters"
msgstr ""
-#: forms.py:77 skins/default/templates/header.html:43
+#: forms.py:84 skins/default/templates/header.html:46
msgid "tags"
msgstr ""
-#: forms.py:79
+#: forms.py:86
msgid ""
"Tags are short keywords, with no spaces within. Up to five tags can be used."
msgstr ""
-#: forms.py:86 skins/default/templates/question_retag.html:39
+#: forms.py:93 skins/default/templates/question_retag.html:39
msgid "tags are required"
msgstr ""
-#: forms.py:95
+#: forms.py:102
#, python-format
msgid "please use %(tag_count)d tag or less"
msgid_plural "please use %(tag_count)d tags or less"
msgstr[0] ""
msgstr[1] ""
-#: forms.py:104
+#: forms.py:111
#, python-format
msgid "each tag must be shorter than %(max_chars)d character"
msgid_plural "each tag must be shorter than %(max_chars)d characters"
msgstr[0] ""
msgstr[1] ""
-#: forms.py:112
+#: forms.py:119
msgid "use-these-chars-in-tags"
msgstr ""
-#: forms.py:122 skins/default/templates/post_contributor_info.html:7
+#: forms.py:129 skins/default/templates/post_contributor_info.html:7
#: skins/default/templates/question_summary_list_roll.html:26
#: skins/default/templates/question_summary_list_roll.html:38
msgid "community wiki"
msgstr ""
-#: forms.py:123
+#: forms.py:130
msgid ""
"if you choose community wiki option, the question and answer do not generate "
"points and name of author will not be shown"
msgstr ""
-#: forms.py:139
+#: forms.py:146
msgid "update summary:"
msgstr ""
-#: forms.py:140
+#: forms.py:147
msgid ""
"enter a brief summary of your revision (e.g. fixed spelling, grammar, "
"improved style, this field is optional)"
msgstr ""
-#: forms.py:153
+#: forms.py:160
msgid "Enter number of points to add or subtract"
msgstr ""
-#: forms.py:167 const/__init__.py:217
+#: forms.py:174 const/__init__.py:217
msgid "approved"
msgstr ""
-#: forms.py:168 const/__init__.py:218
+#: forms.py:175 const/__init__.py:218
msgid "watched"
msgstr ""
-#: forms.py:169 const/__init__.py:219
+#: forms.py:176 const/__init__.py:219
msgid "suspended"
msgstr ""
-#: forms.py:170 const/__init__.py:220
+#: forms.py:177 const/__init__.py:220
msgid "blocked"
msgstr ""
-#: forms.py:172 const/__init__.py:216
+#: forms.py:179 const/__init__.py:216
msgid "moderator"
msgstr ""
-#: forms.py:192
+#: forms.py:199
msgid "Change status to"
msgstr ""
-#: forms.py:219
+#: forms.py:226
msgid "which one?"
msgstr ""
-#: forms.py:240
+#: forms.py:247
msgid "Cannot change own status"
msgstr ""
-#: forms.py:246
+#: forms.py:253
msgid "Cannot turn other user to moderator"
msgstr ""
-#: forms.py:253
+#: forms.py:260
msgid "Cannot change status of another moderator"
msgstr ""
-#: forms.py:259
+#: forms.py:266
#, python-format
msgid "If you wish to change %(username)s's status, "
msgstr ""
-#: forms.py:346
+#: forms.py:275
+msgid "Subject line"
+msgstr ""
+
+#: forms.py:282
+msgid "Message text"
+msgstr ""
+
+#: forms.py:359
msgid "Your name:"
msgstr ""
-#: forms.py:347
+#: forms.py:360
msgid "Email (not shared with anyone):"
msgstr ""
-#: forms.py:348
+#: forms.py:361
msgid "Your message:"
msgstr ""
-#: forms.py:431
+#: forms.py:446
msgid "this email does not have to be linked to gravatar"
msgstr ""
-#: forms.py:433
+#: forms.py:453
msgid "Screen name"
msgstr ""
-#: forms.py:434
+#: forms.py:455
msgid "Real name"
msgstr ""
-#: forms.py:435
+#: forms.py:462
msgid "Website"
msgstr ""
-#: forms.py:436
+#: forms.py:469
msgid "Location"
msgstr ""
-#: forms.py:437
+#: forms.py:476
msgid "Date of birth"
msgstr ""
-#: forms.py:437
+#: forms.py:477
msgid "will not be shown, used to calculate age, format: YYYY-MM-DD"
msgstr ""
-#: forms.py:438 skins/default/templates/account_settings.html:21
+#: forms.py:483 skins/default/templates/account_settings.html:21
#: skins/default/templates/authopenid/settings.html:21
msgid "Profile"
msgstr ""
-#: forms.py:469 forms.py:470
+#: forms.py:516 forms.py:517
msgid "this email has already been registered, please use another one"
msgstr ""
-#: forms.py:476
+#: forms.py:523
msgid "Choose email tag filter"
msgstr ""
-#: forms.py:515
+#: forms.py:562
msgid "Asked by me"
msgstr ""
-#: forms.py:518
+#: forms.py:565
msgid "Answered by me"
msgstr ""
-#: forms.py:521
+#: forms.py:568
msgid "Individually selected"
msgstr ""
-#: forms.py:524
+#: forms.py:571
msgid "Entire forum (tag filtered)"
msgstr ""
-#: forms.py:528
+#: forms.py:575
msgid "Comments and posts mentioning me"
msgstr ""
-#: forms.py:586
+#: forms.py:633
msgid "okay, let's try!"
msgstr ""
-#: forms.py:587
+#: forms.py:634
msgid "no community email please, thanks"
msgstr "no askbot email please, thanks"
-#: forms.py:591
+#: forms.py:638
msgid "please choose one of the options above"
msgstr ""
-#: urls.py:38
-msgid "upfiles/"
-msgstr ""
-
#: urls.py:43
msgid "about/"
msgstr ""
@@ -319,11 +307,11 @@ msgstr ""
msgid "command/"
msgstr ""
-#: urls.py:119 urls.py:126 deps/django_authopenid/urls.py:43
+#: urls.py:119 urls.py:126 deps/django_authopenid/urls.py:44
msgid "delete/"
msgstr ""
-#: urls.py:133 views/readers.py:273
+#: urls.py:133 views/readers.py:270
msgid "question/"
msgstr ""
@@ -375,7 +363,7 @@ msgstr ""
msgid "feedback/"
msgstr ""
-#: urls.py:200 setup_templates/settings.py:198
+#: urls.py:200 setup_templates/settings.py:199
msgid "account/"
msgstr ""
@@ -524,6 +512,44 @@ msgstr ""
msgid "What should \"unanswered question\" mean?"
msgstr ""
+#: conf/markup.py:15
+msgid "Markup formatting"
+msgstr ""
+
+#: conf/markup.py:29
+msgid "Enable code-friendly Markdown"
+msgstr ""
+
+#: conf/markup.py:31
+msgid ""
+"If checked, underscore characters will not trigger italic or bold formatting "
+"- bold and italic text can still be marked up with asterisks. Note that "
+"\"MathJax support\" implicitly turns this feature on, because underscores "
+"are heavily used in LaTeX input."
+msgstr ""
+
+#: conf/markup.py:46
+msgid "Mathjax support (rendering of LaTeX)"
+msgstr ""
+
+#: conf/markup.py:48
+#, python-format
+msgid ""
+"If you enable this feature, <a href=\"%(url)s\">mathjax</a> must be "
+"installed in directory %(dir)s"
+msgstr ""
+
+#: conf/markup.py:63
+msgid "Base url of MathJax deployment"
+msgstr ""
+
+#: conf/markup.py:65
+msgid ""
+"Note - <strong>MathJax is not included with askbot</strong> - you should "
+"deploy it yourself, preferably at a separate domain and enter url pointing "
+"to the \"mathjax\" directory (for example: http://mysite.com/mathjax)"
+msgstr ""
+
#: conf/minimum_reputation.py:11
msgid "Minimum reputation required to perform actions"
msgstr ""
@@ -581,19 +607,15 @@ msgid "View offensive flags"
msgstr ""
#: conf/minimum_reputation.py:137
-msgid "Disable nofollow directive on links"
-msgstr ""
-
-#: conf/minimum_reputation.py:146
msgid "Close questions asked by others"
msgstr ""
-#: conf/minimum_reputation.py:155
+#: conf/minimum_reputation.py:146
msgid "Lock posts"
msgstr ""
#: conf/reputation_changes.py:12
-msgid "Reputaion loss and gain rules"
+msgid "Reputation loss and gain rules"
msgstr ""
#: conf/reputation_changes.py:21
@@ -724,7 +746,7 @@ msgstr ""
#: conf/skin_counter_settings.py:206 conf/skin_counter_settings.py:216
#: conf/skin_counter_settings.py:228 conf/skin_counter_settings.py:239
#: conf/skin_counter_settings.py:252 conf/skin_counter_settings.py:262
-msgid "HTML color name of hex value"
+msgid "HTML color name or hex value"
msgstr ""
#: conf/skin_counter_settings.py:40
@@ -811,30 +833,38 @@ msgstr ""
msgid "Foreground color for accepted answer"
msgstr ""
-#: conf/skin_general_settings.py:12
+#: conf/skin_general_settings.py:14
msgid "Skin and User Interface settings"
msgstr ""
-#: conf/skin_general_settings.py:20
+#: conf/skin_general_settings.py:21
+msgid "Q&A site logo"
+msgstr ""
+
+#: conf/skin_general_settings.py:23
+msgid "To change the logo, select new file, then submit this whole form."
+msgstr ""
+
+#: conf/skin_general_settings.py:38
msgid "Show all UI functions to all users"
msgstr ""
-#: conf/skin_general_settings.py:22
+#: conf/skin_general_settings.py:40
msgid ""
"If checked, all forum functions will be shown to users, regardless of their "
"reputation. However to use those functions, moderation rules, reputation and "
"other limits will still apply."
msgstr ""
-#: conf/skin_general_settings.py:37
+#: conf/skin_general_settings.py:55
msgid "Select skin"
msgstr ""
-#: conf/skin_general_settings.py:46
+#: conf/skin_general_settings.py:64
msgid "Skin media revision number"
msgstr ""
-#: conf/skin_general_settings.py:48
+#: conf/skin_general_settings.py:66
msgid ""
"Increment this number when you change image in skin media or stylesheet. "
"This helps avoid showing your users outdated images from their browser cache."
@@ -1075,7 +1105,7 @@ msgstr ""
msgid "[deleted]"
msgstr ""
-#: const/__init__.py:187 views/readers.py:413 views/readers.py:434
+#: const/__init__.py:187 views/readers.py:411 views/readers.py:433
msgid "initial version"
msgstr ""
@@ -1112,7 +1142,7 @@ msgstr ""
msgid "First time here? Check out the <a href=\"%s\">FAQ</a>!"
msgstr ""
-#: deps/django_authopenid/forms.py:72 deps/django_authopenid/views.py:134
+#: deps/django_authopenid/forms.py:72 deps/django_authopenid/views.py:140
msgid "i-names are not supported"
msgstr ""
@@ -1164,17 +1194,17 @@ msgid ""
"password."
msgstr ""
-#: deps/django_authopenid/forms.py:306
+#: deps/django_authopenid/forms.py:314
msgid "Your user name (<i>required</i>)"
msgstr ""
-#: deps/django_authopenid/forms.py:321
+#: deps/django_authopenid/forms.py:329
msgid "Incorrect username."
msgstr "sorry, there is no such user name"
#: deps/django_authopenid/urls.py:23 deps/django_authopenid/urls.py:24
#: deps/django_authopenid/urls.py:25 deps/django_authopenid/urls.py:27
-#: setup_templates/settings.py:198
+#: setup_templates/settings.py:199
msgid "signin/"
msgstr ""
@@ -1215,7 +1245,7 @@ msgid "confirm/"
msgstr ""
#: deps/django_authopenid/urls.py:38 deps/django_authopenid/urls.py:39
-#: deps/django_authopenid/urls.py:40 deps/django_authopenid/urls.py:41
+#: deps/django_authopenid/urls.py:40 deps/django_authopenid/urls.py:42
msgid "email/"
msgstr ""
@@ -1232,98 +1262,138 @@ msgid "sendkey/"
msgstr ""
#: deps/django_authopenid/urls.py:41
-msgid "verify/"
+msgid "recover/"
msgstr ""
#: deps/django_authopenid/urls.py:42
+msgid "verify/"
+msgstr ""
+
+#: deps/django_authopenid/urls.py:43
msgid "openid/"
msgstr ""
-#: deps/django_authopenid/urls.py:51
+#: deps/django_authopenid/urls.py:52
msgid "external-login/forgot-password/"
msgstr ""
-#: deps/django_authopenid/urls.py:54
+#: deps/django_authopenid/urls.py:55
msgid "external-login/signup/"
msgstr ""
-#: deps/django_authopenid/views.py:141
+#: deps/django_authopenid/views.py:147
#, python-format
msgid "OpenID %(openid_url)s is invalid"
msgstr ""
-#: deps/django_authopenid/views.py:616
+#: deps/django_authopenid/views.py:415
+msgid "Please click any of the icons below to sign in"
+msgstr ""
+
+#: deps/django_authopenid/views.py:417
+msgid "If you wish, please change your login method"
+msgstr ""
+
+#: deps/django_authopenid/views.py:419
+msgid "Please wait a second! Your account is recovered, but ..."
+msgstr ""
+
+#: deps/django_authopenid/views.py:488
+msgid "New login method saved. Thanks!"
+msgstr ""
+
+#: deps/django_authopenid/views.py:705
msgid "Welcome email subject line"
msgstr "Welcome to the Q&A forum"
-#: deps/django_authopenid/views.py:722
+#: deps/django_authopenid/views.py:811
msgid "Password changed."
msgstr ""
-#: deps/django_authopenid/views.py:734 deps/django_authopenid/views.py:740
+#: deps/django_authopenid/views.py:823 deps/django_authopenid/views.py:829
#, python-format
msgid "your email needs to be validated see %(details_url)s"
msgstr ""
"Your email needs to be validated. Please see details <a "
"id='validate_email_alert' href='%(details_url)s'>here</a>."
-#: deps/django_authopenid/views.py:761
+#: deps/django_authopenid/views.py:850
msgid "Email verification subject line"
msgstr "Verification Email from Q&A forum"
-#: deps/django_authopenid/views.py:852
+#: deps/django_authopenid/views.py:916
+msgid "Please check your email and visit the enclosed link."
+msgstr ""
+
+#: deps/django_authopenid/views.py:925
+msgid ""
+"Sorry we cound not find this email it our database. If you think that this "
+"is an error - please contact the site administrator"
+msgstr ""
+
+#: deps/django_authopenid/views.py:935
+msgid "Please enter a valid email address"
+msgstr ""
+
+#: deps/django_authopenid/views.py:953
+msgid ""
+"Sorry this account recovery key has expired or is invalid, please request a "
+"new one"
+msgstr ""
+
+#: deps/django_authopenid/views.py:1007
msgid "your email was not changed"
msgstr ""
-#: deps/django_authopenid/views.py:900 deps/django_authopenid/views.py:1058
+#: deps/django_authopenid/views.py:1055 deps/django_authopenid/views.py:1213
#, python-format
msgid "No OpenID %s found associated in our database"
msgstr ""
-#: deps/django_authopenid/views.py:904 deps/django_authopenid/views.py:1065
+#: deps/django_authopenid/views.py:1059 deps/django_authopenid/views.py:1220
#, python-format
msgid "The OpenID %s isn't associated to current user logged in"
msgstr ""
-#: deps/django_authopenid/views.py:912
+#: deps/django_authopenid/views.py:1067
msgid "Email Changed."
msgstr ""
-#: deps/django_authopenid/views.py:990
+#: deps/django_authopenid/views.py:1145
msgid "This OpenID is already associated with another account."
msgstr ""
-#: deps/django_authopenid/views.py:995
+#: deps/django_authopenid/views.py:1150
#, python-format
msgid "OpenID %s is now associated with your account."
msgstr ""
-#: deps/django_authopenid/views.py:1068
+#: deps/django_authopenid/views.py:1223
msgid "Account deleted."
msgstr ""
-#: deps/django_authopenid/views.py:1120
+#: deps/django_authopenid/views.py:1275
msgid "Request for new password"
msgstr ""
-#: deps/django_authopenid/views.py:1134
+#: deps/django_authopenid/views.py:1289
msgid "A new password and the activation link were sent to your email address."
msgstr ""
-#: deps/django_authopenid/views.py:1166
+#: deps/django_authopenid/views.py:1321
#, python-format
msgid ""
"Could not change password. Confirmation key '%s' is not "
"registered."
msgstr ""
-#: deps/django_authopenid/views.py:1176
+#: deps/django_authopenid/views.py:1331
msgid ""
"Can not change password. User don't exist anymore in our "
"database."
msgstr ""
-#: deps/django_authopenid/views.py:1186
+#: deps/django_authopenid/views.py:1341
#, python-format
msgid "Password changed for %s. You may now sign in."
msgstr ""
@@ -1332,23 +1402,28 @@ msgstr ""
msgid "Site"
msgstr ""
-#: deps/livesettings/values.py:103
+#: deps/livesettings/values.py:107
msgid "Base Settings"
msgstr ""
-#: deps/livesettings/values.py:210
+#: deps/livesettings/values.py:214
msgid "Default value: \"\""
msgstr ""
-#: deps/livesettings/values.py:217
+#: deps/livesettings/values.py:221
msgid "Default value: "
msgstr ""
-#: deps/livesettings/values.py:220
+#: deps/livesettings/values.py:224
#, python-format
msgid "Default value: %s"
msgstr ""
+#: deps/livesettings/values.py:587
+#, python-format
+msgid "Allowed image file types are %(types)s"
+msgstr ""
+
#: deps/livesettings/templates/livesettings/_admin_site_views.html:4
msgid "Sites"
msgstr ""
@@ -1455,15 +1530,27 @@ msgstr ""
msgid "Invalid request"
msgstr ""
-#: importers/stackexchange/management/commands/load_stackexchange.py:124
+#: importers/stackexchange/management/commands/load_stackexchange.py:125
msgid "Congratulations, you are now an Administrator"
msgstr ""
-#: management/commands/send_email_alerts.py:418 models/__init__.py:1439
-msgid "email update message subject"
-msgstr "news from Q&A forum"
+#: management/commands/send_email_alerts.py:104
+#, python-format
+msgid "\" and \"%s\""
+msgstr ""
+
+#: management/commands/send_email_alerts.py:107
+msgid "\" and more"
+msgstr ""
-#: management/commands/send_email_alerts.py:421
+#: management/commands/send_email_alerts.py:112
+#, python-format
+msgid "%(question_count)d updated question about %(topics)s"
+msgid_plural "%(question_count)d updated questions about %(topics)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: management/commands/send_email_alerts.py:466
#, python-format
msgid "%(name)s, this is an update message header for %(num)d question"
msgid_plural "%(name)s, this is an update message header for %(num)d questions"
@@ -1474,38 +1561,38 @@ msgstr[1] ""
"<p>Dear %(name)s,</p><p>The following %(num)d questions have been updated on "
"the Q&A forum:</p>"
-#: management/commands/send_email_alerts.py:438
+#: management/commands/send_email_alerts.py:483
msgid "new question"
msgstr ""
-#: management/commands/send_email_alerts.py:455
+#: management/commands/send_email_alerts.py:500
msgid ""
"Please visit the askbot and see what's new! Could you spread the word about "
"it - can somebody you know help answering those questions or benefit from "
"posting one?"
msgstr ""
-#: management/commands/send_email_alerts.py:467
+#: management/commands/send_email_alerts.py:512
msgid ""
"Your most frequent subscription setting is 'daily' on selected questions. If "
"you are receiving more than one email per dayplease tell about this issue to "
"the askbot administrator."
msgstr ""
-#: management/commands/send_email_alerts.py:473
+#: management/commands/send_email_alerts.py:518
msgid ""
"Your most frequent subscription setting is 'weekly' if you are receiving "
"this email more than once a week please report this issue to the askbot "
"administrator."
msgstr ""
-#: management/commands/send_email_alerts.py:479
+#: management/commands/send_email_alerts.py:524
msgid ""
"There is a chance that you may be receiving links seen before - due to a "
"technicality that will eventually go away. "
msgstr ""
-#: management/commands/send_email_alerts.py:494
+#: management/commands/send_email_alerts.py:529
#, python-format
msgid ""
"go to %(email_settings_link)s to change frequency of email updates or %"
@@ -2009,14 +2096,14 @@ msgid ""
"uploading images is limited to users with >%(min_rep)s reputation points"
msgstr "sorry, file uploading requires karma >%(min_rep)s"
-#: models/__init__.py:264 models/__init__.py:297 models/__init__.py:1734
+#: models/__init__.py:264 models/__init__.py:297 models/__init__.py:1791
msgid "blocked users cannot post"
msgstr ""
"Sorry, your account appears to be blocked and you cannot make new posts "
"until this issue is resolved. Please contact the forum administrator to "
"reach a resolution."
-#: models/__init__.py:265 models/__init__.py:1737
+#: models/__init__.py:265 models/__init__.py:1794
msgid "suspended users cannot post"
msgstr ""
"Sorry, your account appears to be suspended and you cannot make new posts "
@@ -2035,40 +2122,40 @@ msgid ""
"required. You can still comment your own posts and answers to your questions"
msgstr ""
-#: models/__init__.py:311
+#: models/__init__.py:315
msgid ""
"This post has been deleted and can be seen only by post ownwers, site "
"administrators and moderators"
msgstr ""
-#: models/__init__.py:328
+#: models/__init__.py:332
msgid ""
"Sorry, only moderators, site administrators and post owners can edit deleted "
"posts"
msgstr ""
-#: models/__init__.py:343
+#: models/__init__.py:347
msgid "Sorry, since your account is blocked you cannot edit posts"
msgstr ""
-#: models/__init__.py:347
+#: models/__init__.py:351
msgid "Sorry, since your account is suspended you can edit only your own posts"
msgstr ""
-#: models/__init__.py:352
+#: models/__init__.py:356
#, python-format
msgid ""
-"Sorry, to edit wiki' posts, a minimum reputation of %(min_rep)s is required"
+"Sorry, to edit wiki posts, a minimum reputation of %(min_rep)s is required"
msgstr ""
-#: models/__init__.py:359
+#: models/__init__.py:363
#, python-format
msgid ""
-"Sorry, to edit other people' posts, a minimum reputation of %(min_rep)s is "
+"Sorry, to edit other people's posts, a minimum reputation of %(min_rep)s is "
"required"
msgstr ""
-#: models/__init__.py:422
+#: models/__init__.py:426
msgid ""
"Sorry, cannot delete your question since it has an upvoted answer posted by "
"someone else"
@@ -2078,181 +2165,211 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: models/__init__.py:437
+#: models/__init__.py:441
msgid "Sorry, since your account is blocked you cannot delete posts"
msgstr ""
-#: models/__init__.py:441
+#: models/__init__.py:445
msgid ""
"Sorry, since your account is suspended you can delete only your own posts"
msgstr ""
-#: models/__init__.py:445
+#: models/__init__.py:449
#, python-format
msgid ""
"Sorry, to deleted other people' posts, a minimum reputation of %(min_rep)s "
"is required"
msgstr ""
-#: models/__init__.py:465
+#: models/__init__.py:469
msgid "Sorry, since your account is blocked you cannot close questions"
msgstr ""
-#: models/__init__.py:469
+#: models/__init__.py:473
msgid "Sorry, since your account is suspended you cannot close questions"
msgstr ""
-#: models/__init__.py:473
+#: models/__init__.py:477
#, python-format
msgid ""
"Sorry, to close other people' posts, a minimum reputation of %(min_rep)s is "
"required"
msgstr ""
-#: models/__init__.py:482
+#: models/__init__.py:486
#, python-format
msgid ""
"Sorry, to close own question a minimum reputation of %(min_rep)s is required"
msgstr ""
-#: models/__init__.py:506
+#: models/__init__.py:510
#, python-format
msgid ""
"Sorry, only administrators, moderators or post owners with reputation > %"
"(min_rep)s can reopen questions."
msgstr ""
-#: models/__init__.py:512
+#: models/__init__.py:516
#, python-format
msgid ""
"Sorry, to reopen own question a minimum reputation of %(min_rep)s is required"
msgstr ""
-#: models/__init__.py:532
+#: models/__init__.py:536
msgid "cannot flag message as offensive twice"
msgstr "You have flagged this question before and cannot do it more than once"
-#: models/__init__.py:537
+#: models/__init__.py:541
msgid "blocked users cannot flag posts"
msgstr ""
"Sorry, since your account is blocked you cannot flag posts as offensive"
-#: models/__init__.py:539
+#: models/__init__.py:543
msgid "suspended users cannot flag posts"
msgstr ""
"Sorry, your account appears to be suspended and you cannot make new posts "
"until this issue is resolved. You can, however edit your existing posts. "
"Please contact the forum administrator to reach a resolution."
-#: models/__init__.py:541
+#: models/__init__.py:545
#, python-format
msgid "need > %(min_rep)s points to flag spam"
msgstr ""
"Sorry, to flag posts as offensive a minimum reputation of %(min_rep)s is "
"required"
-#: models/__init__.py:562
+#: models/__init__.py:566
#, python-format
msgid "%(max_flags_per_day)s exceeded"
msgstr ""
"Sorry, you have exhausted the maximum number of %(max_flags_per_day)s "
"offensive flags per day."
-#: models/__init__.py:577
+#: models/__init__.py:581
msgid ""
"Sorry, only question owners, site administrators and moderators can retag "
"deleted questions"
msgstr ""
-#: models/__init__.py:584
+#: models/__init__.py:588
msgid "Sorry, since your account is blocked you cannot retag questions"
msgstr ""
-#: models/__init__.py:588
+#: models/__init__.py:592
msgid ""
"Sorry, since your account is suspended you can retag only your own questions"
msgstr ""
-#: models/__init__.py:592
+#: models/__init__.py:596
#, python-format
msgid ""
"Sorry, to retag questions a minimum reputation of %(min_rep)s is required"
msgstr ""
-#: models/__init__.py:611
+#: models/__init__.py:615
msgid "Sorry, since your account is blocked you cannot delete comment"
msgstr ""
-#: models/__init__.py:615
+#: models/__init__.py:619
msgid ""
"Sorry, since your account is suspended you can delete only your own comments"
msgstr ""
-#: models/__init__.py:619
+#: models/__init__.py:623
#, python-format
msgid "Sorry, to delete comments reputation of %(min_rep)s is required"
msgstr ""
-#: models/__init__.py:642
+#: models/__init__.py:646
msgid "cannot revoke old vote"
msgstr "sorry, but older votes cannot be revoked"
-#: models/__init__.py:1072 views/users.py:375
+#: models/__init__.py:1118 views/users.py:404
msgid "Site Adminstrator"
msgstr ""
-#: models/__init__.py:1074 views/users.py:377
+#: models/__init__.py:1120 views/users.py:406
msgid "Forum Moderator"
msgstr ""
-#: models/__init__.py:1076 views/users.py:379
+#: models/__init__.py:1122 views/users.py:408
msgid "Suspended User"
msgstr ""
-#: models/__init__.py:1078 views/users.py:381
+#: models/__init__.py:1124 views/users.py:410
msgid "Blocked User"
msgstr ""
-#: models/__init__.py:1080 views/users.py:383
+#: models/__init__.py:1126 views/users.py:412
msgid "Registered User"
msgstr ""
-#: models/__init__.py:1082
+#: models/__init__.py:1128
msgid "Watched User"
msgstr ""
-#: models/__init__.py:1084
+#: models/__init__.py:1130
msgid "Approved User"
msgstr ""
-#: models/__init__.py:1566
+#: models/__init__.py:1437
+#, python-format
+msgid "new question comment about: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1443
+#, python-format
+msgid "new answer comment about: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1448
+#, python-format
+msgid "answer modified for: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1453
+#, python-format
+msgid "new answer for: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1458
+#, python-format
+msgid "question modified: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1463
+#, python-format
+msgid "new question: \"%(title)s\""
+msgstr ""
+
+#: models/__init__.py:1623
#, python-format
msgid ""
"Congratulations, you have received a badge '%(badge_name)s'. Check out <a "
"href=\"%(user_profile)s\">your profile</a>."
msgstr ""
-#: models/question.py:566
+#: models/question.py:597
#, python-format
msgid "%(author)s modified the question"
msgstr ""
-#: models/question.py:570
+#: models/question.py:601
#, python-format
msgid "%(people)s posted %(new_answer_count)s new answers"
msgstr ""
-#: models/question.py:575
+#: models/question.py:606
#, python-format
msgid "%(people)s commented the question"
msgstr ""
-#: models/question.py:580
+#: models/question.py:611
#, python-format
msgid "%(people)s commented answers"
msgstr ""
-#: models/question.py:582
+#: models/question.py:613
#, python-format
msgid "%(people)s commented an answer"
msgstr ""
@@ -2442,73 +2559,73 @@ msgstr ""
msgid "Erase your username and all your data from website"
msgstr ""
-#: skins/default/templates/answer_edit.html:5
-#: skins/default/templates/answer_edit.html:48
+#: skins/default/templates/answer_edit.html:6
+#: skins/default/templates/answer_edit.html:56
msgid "Edit answer"
msgstr ""
-#: skins/default/templates/answer_edit.html:25
-#: skins/default/templates/answer_edit.html:28
-#: skins/default/templates/ask.html:26 skins/default/templates/ask.html:29
-#: skins/default/templates/question.html:48
-#: skins/default/templates/question.html:51
-#: skins/default/templates/question_edit.html:25
-#: skins/default/templates/question_edit.html:28
+#: skins/default/templates/answer_edit.html:33
+#: skins/default/templates/answer_edit.html:36
+#: skins/default/templates/ask.html:34 skins/default/templates/ask.html:37
+#: skins/default/templates/question.html:55
+#: skins/default/templates/question.html:58
+#: skins/default/templates/question_edit.html:33
+#: skins/default/templates/question_edit.html:36
msgid "hide preview"
msgstr ""
-#: skins/default/templates/answer_edit.html:28
-#: skins/default/templates/ask.html:29
-#: skins/default/templates/question.html:51
-#: skins/default/templates/question_edit.html:28
+#: skins/default/templates/answer_edit.html:36
+#: skins/default/templates/ask.html:37
+#: skins/default/templates/question.html:58
+#: skins/default/templates/question_edit.html:36
msgid "show preview"
msgstr ""
-#: skins/default/templates/answer_edit.html:48
-#: skins/default/templates/question_edit.html:66
+#: skins/default/templates/answer_edit.html:56
+#: skins/default/templates/question_edit.html:74
#: skins/default/templates/question_retag.html:53
#: skins/default/templates/revisions_answer.html:38
#: skins/default/templates/revisions_question.html:38
msgid "back"
msgstr ""
-#: skins/default/templates/answer_edit.html:53
-#: skins/default/templates/question_edit.html:71
+#: skins/default/templates/answer_edit.html:61
+#: skins/default/templates/question_edit.html:79
#: skins/default/templates/revisions_answer.html:52
#: skins/default/templates/revisions_question.html:52
msgid "revision"
msgstr ""
-#: skins/default/templates/answer_edit.html:56
-#: skins/default/templates/question_edit.html:76
+#: skins/default/templates/answer_edit.html:64
+#: skins/default/templates/question_edit.html:84
msgid "select revision"
msgstr ""
-#: skins/default/templates/answer_edit.html:63
-#: skins/default/templates/ask.html:98
+#: skins/default/templates/answer_edit.html:71
+#: skins/default/templates/ask.html:106
#: skins/default/templates/ask_form.html:39
-#: skins/default/templates/question.html:428
-#: skins/default/templates/question_edit.html:93
+#: skins/default/templates/question.html:435
+#: skins/default/templates/question_edit.html:101
msgid "Toggle the real time Markdown editor preview"
msgstr ""
-#: skins/default/templates/answer_edit.html:63
-#: skins/default/templates/ask.html:98
+#: skins/default/templates/answer_edit.html:71
+#: skins/default/templates/ask.html:106
#: skins/default/templates/ask_form.html:39
-#: skins/default/templates/question.html:429
-#: skins/default/templates/question_edit.html:93
+#: skins/default/templates/question.html:436
+#: skins/default/templates/question_edit.html:101
msgid "toggle preview"
msgstr ""
-#: skins/default/templates/answer_edit.html:72
-#: skins/default/templates/question_edit.html:119
+#: skins/default/templates/answer_edit.html:80
+#: skins/default/templates/question_edit.html:127
msgid "Save edit"
msgstr ""
-#: skins/default/templates/answer_edit.html:73
+#: skins/default/templates/answer_edit.html:81
#: skins/default/templates/close.html:29
#: skins/default/templates/feedback.html:50
-#: skins/default/templates/question_edit.html:120
+#: skins/default/templates/question_edit.html:128
#: skins/default/templates/question_retag.html:75
#: skins/default/templates/reopen.html:40
#: skins/default/templates/user_edit.html:89
@@ -2516,84 +2633,94 @@ msgstr ""
msgid "Cancel"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:4
+#: skins/default/templates/answer_edit_tips.html:5
msgid "answer tips"
msgstr "Tips"
-#: skins/default/templates/answer_edit_tips.html:7
+#: skins/default/templates/answer_edit_tips.html:8
msgid "please make your answer relevant to this community"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:10
+#: skins/default/templates/answer_edit_tips.html:11
msgid "try to give an answer, rather than engage into a discussion"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:13
+#: skins/default/templates/answer_edit_tips.html:14
msgid "please try to provide details"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:16
+#: skins/default/templates/answer_edit_tips.html:17
#: skins/default/templates/question_edit_tips.html:13
msgid "be clear and concise"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:20
+#: skins/default/templates/answer_edit_tips.html:21
#: skins/default/templates/question_edit_tips.html:17
msgid "see frequently asked questions"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:26
+#: skins/default/templates/answer_edit_tips.html:27
#: skins/default/templates/question_edit_tips.html:23
msgid "Markdown tips"
msgstr "Markdown basics"
-#: skins/default/templates/answer_edit_tips.html:29
-#: skins/default/templates/question_edit_tips.html:26
-msgid "*italic* or __italic__"
+#: skins/default/templates/answer_edit_tips.html:31
+#: skins/default/templates/question_edit_tips.html:27
+msgid "*italic*"
+msgstr ""
+
+#: skins/default/templates/answer_edit_tips.html:34
+#: skins/default/templates/question_edit_tips.html:30
+msgid "**bold**"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:32
-#: skins/default/templates/question_edit_tips.html:29
+#: skins/default/templates/answer_edit_tips.html:38
+#: skins/default/templates/question_edit_tips.html:34
+msgid "*italic* or _italic_"
+msgstr ""
+
+#: skins/default/templates/answer_edit_tips.html:41
+#: skins/default/templates/question_edit_tips.html:37
msgid "**bold** or __bold__"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:35
-#: skins/default/templates/question_edit_tips.html:32
+#: skins/default/templates/answer_edit_tips.html:45
+#: skins/default/templates/question_edit_tips.html:41
msgid "link"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:35
-#: skins/default/templates/answer_edit_tips.html:39
-#: skins/default/templates/question_edit_tips.html:32
-#: skins/default/templates/question_edit_tips.html:37
+#: skins/default/templates/answer_edit_tips.html:45
+#: skins/default/templates/answer_edit_tips.html:49
+#: skins/default/templates/question_edit_tips.html:41
+#: skins/default/templates/question_edit_tips.html:46
msgid "text"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:39
-#: skins/default/templates/question_edit_tips.html:37
+#: skins/default/templates/answer_edit_tips.html:49
+#: skins/default/templates/question_edit_tips.html:46
msgid "image"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:43
-#: skins/default/templates/question_edit_tips.html:41
+#: skins/default/templates/answer_edit_tips.html:53
+#: skins/default/templates/question_edit_tips.html:50
msgid "numbered list:"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:48
-#: skins/default/templates/question_edit_tips.html:46
+#: skins/default/templates/answer_edit_tips.html:58
+#: skins/default/templates/question_edit_tips.html:55
msgid "basic HTML tags are also supported"
msgstr ""
-#: skins/default/templates/answer_edit_tips.html:52
-#: skins/default/templates/question_edit_tips.html:50
+#: skins/default/templates/answer_edit_tips.html:62
+#: skins/default/templates/question_edit_tips.html:59
msgid "learn more about Markdown"
msgstr ""
-#: skins/default/templates/ask.html:5 skins/default/templates/ask.html:62
+#: skins/default/templates/ask.html:6 skins/default/templates/ask.html:70
msgid "Ask a question"
msgstr ""
-#: skins/default/templates/ask.html:69
+#: skins/default/templates/ask.html:77
#: skins/default/templates/ask_form.html:11
msgid "login to post question info"
msgstr ""
@@ -2603,7 +2730,7 @@ msgstr ""
"will be published after you log in. Login/signup process is very simple. "
"Login takes about 30 seconds, initial signup takes a minute or less."
-#: skins/default/templates/ask.html:75
+#: skins/default/templates/ask.html:83
#, python-format
msgid ""
"must have valid %(email)s to post, \n"
@@ -2616,17 +2743,17 @@ msgstr ""
"<br>You can submit your question now and validate email after that. Your "
"question will saved as pending meanwhile. "
-#: skins/default/templates/ask.html:113
+#: skins/default/templates/ask.html:121
#: skins/default/templates/ask_form.html:54
msgid "(required)"
msgstr ""
-#: skins/default/templates/ask.html:120
+#: skins/default/templates/ask.html:128
#: skins/default/templates/ask_form.html:61
msgid "Login/signup to post your question"
msgstr "Login/Signup to Post"
-#: skins/default/templates/ask.html:122
+#: skins/default/templates/ask.html:130
#: skins/default/templates/ask_form.html:63
msgid "Ask your question"
msgstr "Ask Your Question"
@@ -2783,7 +2910,7 @@ msgid "the answer has been accepted to be correct"
msgstr ""
#: skins/default/templates/book.html:110
-#: skins/default/templates/questions.html:206
+#: skins/default/templates/questions.html:214
msgid "answer"
msgstr ""
@@ -2793,10 +2920,10 @@ msgid "views"
msgstr ""
#: skins/default/templates/book.html:125
-#: skins/default/templates/question.html:138
+#: skins/default/templates/question.html:145
#: skins/default/templates/question_list.html:64
#: skins/default/templates/question_summary_list_roll.html:52
-#: skins/default/templates/questions.html:227
+#: skins/default/templates/questions.html:239
#: skins/default/templates/tags.html:50
#: skins/default/templates/users_questions.html:80
#, python-format
@@ -2948,7 +3075,7 @@ msgid "open and close own questions"
msgstr ""
#: skins/default/templates/faq.html:74
-msgid "retag questions"
+msgid "retag other's questions"
msgstr ""
#: skins/default/templates/faq.html:79
@@ -3052,7 +3179,7 @@ msgstr ""
"Please <a href='%(ask_question_url)s'>ask</a> your question, help make our "
"community better!"
-#: skins/default/templates/faq.html:122 skins/default/templates/header.html:42
+#: skins/default/templates/faq.html:122 skins/default/templates/header.html:45
msgid "questions"
msgstr ""
@@ -3162,19 +3289,23 @@ msgstr "sign out"
msgid "login"
msgstr "Hi, there! Please sign in"
-#: skins/default/templates/header.html:37
+#: skins/default/templates/header.html:32
+msgid "settings"
+msgstr ""
+
+#: skins/default/templates/header.html:40
msgid "back to home page"
msgstr ""
-#: skins/default/templates/header.html:44
+#: skins/default/templates/header.html:47
msgid "users"
msgstr "people"
-#: skins/default/templates/header.html:45
+#: skins/default/templates/header.html:48
msgid "badges"
msgstr ""
-#: skins/default/templates/header.html:46
+#: skins/default/templates/header.html:49
msgid "ask a question"
msgstr ""
@@ -3326,91 +3457,91 @@ msgstr ""
msgid "Privacy policy"
msgstr ""
-#: skins/default/templates/question.html:80
-#: skins/default/templates/question.html:81
-#: skins/default/templates/question.html:97
-#: skins/default/templates/question.html:99
+#: skins/default/templates/question.html:87
+#: skins/default/templates/question.html:88
+#: skins/default/templates/question.html:104
+#: skins/default/templates/question.html:106
msgid "i like this post (click again to cancel)"
msgstr ""
-#: skins/default/templates/question.html:83
-#: skins/default/templates/question.html:101
-#: skins/default/templates/question.html:261
+#: skins/default/templates/question.html:90
+#: skins/default/templates/question.html:108
+#: skins/default/templates/question.html:268
msgid "current number of votes"
msgstr ""
-#: skins/default/templates/question.html:92
-#: skins/default/templates/question.html:93
-#: skins/default/templates/question.html:106
-#: skins/default/templates/question.html:107
+#: skins/default/templates/question.html:99
+#: skins/default/templates/question.html:100
+#: skins/default/templates/question.html:113
+#: skins/default/templates/question.html:114
msgid "i dont like this post (click again to cancel)"
msgstr ""
-#: skins/default/templates/question.html:111
-#: skins/default/templates/question.html:112
+#: skins/default/templates/question.html:118
+#: skins/default/templates/question.html:119
msgid "mark this question as favorite (click again to cancel)"
msgstr ""
-#: skins/default/templates/question.html:118
-#: skins/default/templates/question.html:119
+#: skins/default/templates/question.html:125
+#: skins/default/templates/question.html:126
msgid "remove favorite mark from this question (click again to restore mark)"
msgstr ""
-#: skins/default/templates/question.html:144
-#: skins/default/templates/question.html:298
+#: skins/default/templates/question.html:151
+#: skins/default/templates/question.html:305
#: skins/default/templates/revisions_answer.html:58
#: skins/default/templates/revisions_question.html:58
msgid "edit"
msgstr ""
-#: skins/default/templates/question.html:149
+#: skins/default/templates/question.html:156
msgid "retag"
msgstr ""
-#: skins/default/templates/question.html:156
+#: skins/default/templates/question.html:163
msgid "reopen"
msgstr ""
-#: skins/default/templates/question.html:160
+#: skins/default/templates/question.html:167
msgid "close"
msgstr ""
-#: skins/default/templates/question.html:166
-#: skins/default/templates/question.html:303
+#: skins/default/templates/question.html:173
+#: skins/default/templates/question.html:310
msgid ""
"report as offensive (i.e containing spam, advertising, malicious text, etc.)"
msgstr ""
-#: skins/default/templates/question.html:167
-#: skins/default/templates/question.html:304
+#: skins/default/templates/question.html:174
+#: skins/default/templates/question.html:311
msgid "flag offensive"
msgstr ""
-#: skins/default/templates/question.html:175
-#: skins/default/templates/question.html:315
+#: skins/default/templates/question.html:182
+#: skins/default/templates/question.html:322
msgid "delete"
msgstr ""
-#: skins/default/templates/question.html:193
-#: skins/default/templates/question.html:335
+#: skins/default/templates/question.html:200
+#: skins/default/templates/question.html:342
msgid "delete this comment"
msgstr ""
-#: skins/default/templates/question.html:204
-#: skins/default/templates/question.html:346
+#: skins/default/templates/question.html:211
+#: skins/default/templates/question.html:353
msgid "add comment"
msgstr "post a comment"
-#: skins/default/templates/question.html:208
-#: skins/default/templates/question.html:350
+#: skins/default/templates/question.html:215
+#: skins/default/templates/question.html:357
#, python-format
msgid "see <strong>%(counter)s</strong> more"
msgid_plural "see <strong>%(counter)s</strong> more"
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/question.html:210
-#: skins/default/templates/question.html:352
+#: skins/default/templates/question.html:217
+#: skins/default/templates/question.html:359
#, python-format
msgid "see <strong>%(counter)s</strong> more comment"
msgid_plural ""
@@ -3419,18 +3550,18 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/question.html:223
+#: skins/default/templates/question.html:230
#, python-format
msgid ""
"The question has been closed for the following reason \"%(close_reason)s\" by"
msgstr ""
-#: skins/default/templates/question.html:225
+#: skins/default/templates/question.html:232
#, python-format
msgid "close date %(closed_at)s"
msgstr ""
-#: skins/default/templates/question.html:233
+#: skins/default/templates/question.html:240
#, python-format
msgid ""
"\n"
@@ -3443,75 +3574,76 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/question.html:241
+#: skins/default/templates/question.html:248
msgid "oldest answers will be shown first"
msgstr ""
-#: skins/default/templates/question.html:241
+#: skins/default/templates/question.html:248
msgid "oldest answers"
msgstr "oldest"
-#: skins/default/templates/question.html:243
+#: skins/default/templates/question.html:250
msgid "newest answers will be shown first"
msgstr ""
-#: skins/default/templates/question.html:243
+#: skins/default/templates/question.html:250
msgid "newest answers"
msgstr "newest"
-#: skins/default/templates/question.html:245
+#: skins/default/templates/question.html:252
msgid "most voted answers will be shown first"
msgstr ""
-#: skins/default/templates/question.html:245
+#: skins/default/templates/question.html:252
msgid "popular answers"
msgstr "most voted"
-#: skins/default/templates/question.html:259
-#: skins/default/templates/question.html:260
+#: skins/default/templates/question.html:266
+#: skins/default/templates/question.html:267
msgid "i like this answer (click again to cancel)"
msgstr ""
-#: skins/default/templates/question.html:266
-#: skins/default/templates/question.html:267
+#: skins/default/templates/question.html:273
+#: skins/default/templates/question.html:274
msgid "i dont like this answer (click again to cancel)"
msgstr ""
-#: skins/default/templates/question.html:272
-#: skins/default/templates/question.html:273
+#: skins/default/templates/question.html:279
+#: skins/default/templates/question.html:280
msgid "mark this answer as favorite (click again to undo)"
msgstr ""
-#: skins/default/templates/question.html:278
-#: skins/default/templates/question.html:279
-msgid "the author of the question has selected this answer as correct"
+#: skins/default/templates/question.html:285
+#: skins/default/templates/question.html:286
+#, python-format
+msgid "%(question_author)s has selected this answer as correct"
msgstr ""
-#: skins/default/templates/question.html:292
+#: skins/default/templates/question.html:299
msgid "answer permanent link"
msgstr ""
-#: skins/default/templates/question.html:293
+#: skins/default/templates/question.html:300
msgid "permanent link"
msgstr "link"
-#: skins/default/templates/question.html:315
+#: skins/default/templates/question.html:322
msgid "undelete"
msgstr ""
-#: skins/default/templates/question.html:374
-#: skins/default/templates/question.html:377
+#: skins/default/templates/question.html:381
+#: skins/default/templates/question.html:384
msgid "Notify me once a day when there are any new answers"
msgstr ""
"<strong>Notify me</strong> once a day by email when there are any new "
"answers or updates"
-#: skins/default/templates/question.html:380
+#: skins/default/templates/question.html:387
msgid "Notify me weekly when there are any new answers"
msgstr ""
"<strong>Notify me</strong> weekly when there are any new answers or updates"
-#: skins/default/templates/question.html:385
+#: skins/default/templates/question.html:392
#, python-format
msgid ""
"You can always adjust frequency of email updates from your %(profile_url)s"
@@ -3519,21 +3651,21 @@ msgstr ""
"(note: you can always <strong><a href='%(profile_url)s?"
"sort=email_subscriptions'>change</a></strong> how often you receive updates)"
-#: skins/default/templates/question.html:390
+#: skins/default/templates/question.html:397
msgid "once you sign in you will be able to subscribe for any updates here"
msgstr ""
"<span class='strong'>Here</span> (once you log in) you will be able to sign "
"up for the periodic email updates about this question."
-#: skins/default/templates/question.html:401
+#: skins/default/templates/question.html:408
msgid "Your answer"
msgstr ""
-#: skins/default/templates/question.html:403
+#: skins/default/templates/question.html:410
msgid "Be the first one to answer this question!"
msgstr ""
-#: skins/default/templates/question.html:409
+#: skins/default/templates/question.html:416
msgid "you can answer anonymously and then login"
msgstr ""
"<span class='strong big'>Please start posting your answer anonymously</span> "
@@ -3542,7 +3674,7 @@ msgstr ""
"answer</strong>, for discussions, <strong>please use comments</strong> and "
"<strong>please do remember to vote</strong> (after you log in)!"
-#: skins/default/templates/question.html:413
+#: skins/default/templates/question.html:420
msgid "answer your own question only to give an answer"
msgstr ""
"<span class='big strong'>You are welcome to answer your own question</span>, "
@@ -3552,7 +3684,7 @@ msgstr ""
"forget to vote :)</strong> for the answers that you liked (or perhaps did "
"not like)! "
-#: skins/default/templates/question.html:415
+#: skins/default/templates/question.html:422
msgid "please only give an answer, no discussions"
msgstr ""
"<span class='big strong'>Please try to give a substantial answer</span>. If "
@@ -3562,47 +3694,47 @@ msgstr ""
"please <strong>don't forget to vote</strong> - it really helps to select the "
"best questions and answers!"
-#: skins/default/templates/question.html:451
+#: skins/default/templates/question.html:458
msgid "Login/Signup to Post Your Answer"
msgstr ""
-#: skins/default/templates/question.html:454
+#: skins/default/templates/question.html:461
msgid "Answer Your Own Question"
msgstr ""
-#: skins/default/templates/question.html:456
+#: skins/default/templates/question.html:463
msgid "Answer the question"
msgstr "Post Your Answer"
-#: skins/default/templates/question.html:471
+#: skins/default/templates/question.html:478
msgid "Question tags"
msgstr "Tags"
-#: skins/default/templates/question.html:476
-#: skins/default/templates/questions.html:312
+#: skins/default/templates/question.html:483
+#: skins/default/templates/questions.html:324
#: skins/default/templates/tag_selector.html:11
#: skins/default/templates/tag_selector.html:28
#, python-format
msgid "see questions tagged '%(tag_name)s'"
msgstr ""
-#: skins/default/templates/question.html:482
+#: skins/default/templates/question.html:489
msgid "question asked"
msgstr "Asked"
-#: skins/default/templates/question.html:485
+#: skins/default/templates/question.html:492
msgid "question was seen"
msgstr "Seen"
-#: skins/default/templates/question.html:485
+#: skins/default/templates/question.html:492
msgid "times"
msgstr ""
-#: skins/default/templates/question.html:488
+#: skins/default/templates/question.html:495
msgid "last updated"
msgstr "Last updated"
-#: skins/default/templates/question.html:494
+#: skins/default/templates/question.html:502
msgid "Related questions"
msgstr ""
@@ -3624,7 +3756,7 @@ msgstr[1] ""
#: skins/default/templates/question_counter_widget.html:21
#: skins/default/templates/question_list.html:23
-#: skins/default/templates/questions.html:194
+#: skins/default/templates/questions.html:198
#: skins/default/templates/users_questions.html:43
msgid "this answer has been accepted to be correct"
msgstr ""
@@ -3653,8 +3785,8 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/question_edit.html:5
-#: skins/default/templates/question_edit.html:66
+#: skins/default/templates/question_edit.html:6
+#: skins/default/templates/question_edit.html:74
msgid "Edit question"
msgstr ""
@@ -3874,64 +4006,64 @@ msgstr ""
msgid "add tags and a query to focus your search"
msgstr ""
-#: skins/default/templates/questions.html:190
+#: skins/default/templates/questions.html:194
msgid "vote"
msgid_plural "votes"
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/questions.html:214
+#: skins/default/templates/questions.html:226
msgid "view"
msgid_plural "views"
msgstr[0] ""
msgstr[1] ""
-#: skins/default/templates/questions.html:238
+#: skins/default/templates/questions.html:250
msgid "There are no unanswered questions here"
msgstr ""
-#: skins/default/templates/questions.html:241
+#: skins/default/templates/questions.html:253
msgid "No favorite questions here. "
msgstr ""
-#: skins/default/templates/questions.html:242
+#: skins/default/templates/questions.html:254
msgid "Please start (bookmark) some questions when you visit them"
msgstr ""
-#: skins/default/templates/questions.html:247
+#: skins/default/templates/questions.html:259
msgid "You can expand your search by "
msgstr ""
-#: skins/default/templates/questions.html:251
+#: skins/default/templates/questions.html:263
msgid "resetting author"
msgstr ""
-#: skins/default/templates/questions.html:255
+#: skins/default/templates/questions.html:267
msgid "resetting tags"
msgstr ""
-#: skins/default/templates/questions.html:259
-#: skins/default/templates/questions.html:263
+#: skins/default/templates/questions.html:271
+#: skins/default/templates/questions.html:275
msgid "starting over"
msgstr ""
-#: skins/default/templates/questions.html:268
+#: skins/default/templates/questions.html:280
msgid "Please always feel free to ask your question!"
msgstr ""
-#: skins/default/templates/questions.html:272
+#: skins/default/templates/questions.html:284
msgid "Did not find what you were looking for?"
msgstr ""
-#: skins/default/templates/questions.html:273
+#: skins/default/templates/questions.html:285
msgid "Please, post your question!"
msgstr ""
-#: skins/default/templates/questions.html:291
+#: skins/default/templates/questions.html:303
msgid "Contributors"
msgstr ""
-#: skins/default/templates/questions.html:307
+#: skins/default/templates/questions.html:319
msgid "Related tags"
msgstr "Tags"
@@ -3991,7 +4123,7 @@ msgstr ""
#: skins/default/templates/tag_selector.html:21
#: skins/default/templates/tag_selector.html:38
-#: skins/default/templates/user_moderate.html:31
+#: skins/default/templates/user_moderate.html:37
msgid "Add"
msgstr ""
@@ -4135,24 +4267,51 @@ msgstr ""
msgid "%(username)s's current status is \"%(status)s\""
msgstr ""
-#: skins/default/templates/user_moderate.html:14
+#: skins/default/templates/user_moderate.html:10
+msgid "User status changed"
+msgstr ""
+
+#: skins/default/templates/user_moderate.html:17
msgid "Save"
msgstr ""
-#: skins/default/templates/user_moderate.html:20
+#: skins/default/templates/user_moderate.html:23
#, python-format
msgid "Your current reputation is %(reputation)s points"
msgstr ""
-#: skins/default/templates/user_moderate.html:22
+#: skins/default/templates/user_moderate.html:25
#, python-format
msgid "User's current reputation is %(reputation)s points"
msgstr ""
-#: skins/default/templates/user_moderate.html:30
+#: skins/default/templates/user_moderate.html:29
+msgid "User reputation changed"
+msgstr ""
+
+#: skins/default/templates/user_moderate.html:36
msgid "Subtract"
msgstr ""
+#: skins/default/templates/user_moderate.html:41
+#, python-format
+msgid "Send message to %(username)s"
+msgstr ""
+
+#: skins/default/templates/user_moderate.html:42
+msgid ""
+"An email will be sent to the user with 'reply-to' field set to your email "
+"address. Please make sure that your address is entered correctly."
+msgstr ""
+
+#: skins/default/templates/user_moderate.html:44
+msgid "Message sent"
+msgstr ""
+
+#: skins/default/templates/user_moderate.html:62
+msgid "Send message"
+msgstr ""
+
#: skins/default/templates/user_reputation.html:29
msgid "Your karma change log."
msgstr ""
@@ -4251,7 +4410,7 @@ msgstr ""
msgid "activity"
msgstr ""
-#: skins/default/templates/user_tabs.html:15 views/users.py:740
+#: skins/default/templates/user_tabs.html:15 views/users.py:769
msgid "comments and answers to others questions"
msgstr ""
@@ -4267,7 +4426,7 @@ msgstr "Graph of user karma"
msgid "reputation history"
msgstr "karma history"
-#: skins/default/templates/user_tabs.html:23 views/users.py:804
+#: skins/default/templates/user_tabs.html:23 views/users.py:833
msgid "user vote record"
msgstr ""
@@ -4283,7 +4442,7 @@ msgstr ""
msgid "favorites"
msgstr ""
-#: skins/default/templates/user_tabs.html:31 views/users.py:929
+#: skins/default/templates/user_tabs.html:31 views/users.py:958
msgid "email subscription settings"
msgstr ""
@@ -4291,7 +4450,7 @@ msgstr ""
msgid "subscriptions"
msgstr ""
-#: skins/default/templates/user_tabs.html:36 views/users.py:187
+#: skins/default/templates/user_tabs.html:36 views/users.py:215
msgid "moderate this user"
msgstr ""
@@ -4471,15 +4630,15 @@ msgstr ""
"<span class='strong'>To change your password</span> please fill out and "
"submit this form"
-#: skins/default/templates/authopenid/complete.html:19
+#: skins/default/templates/authopenid/complete.html:22
msgid "Connect your OpenID with this site"
msgstr "New user signup"
-#: skins/default/templates/authopenid/complete.html:22
+#: skins/default/templates/authopenid/complete.html:25
msgid "Connect your OpenID with your account on this site"
msgstr "New user signup"
-#: skins/default/templates/authopenid/complete.html:27
+#: skins/default/templates/authopenid/complete.html:30
#, python-format
msgid "register new %(provider)s account info, see %(gravatar_faq_url)s"
msgstr ""
@@ -4490,7 +4649,7 @@ msgstr ""
"questions and will be used to create and retrieve your unique avatar image - "
"<a href='%(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>"
-#: skins/default/templates/authopenid/complete.html:31
+#: skins/default/templates/authopenid/complete.html:34
#, python-format
msgid ""
"%(username)s already exists, choose another name for \n"
@@ -4507,7 +4666,7 @@ msgstr ""
"updates</strong> on the interesting questions or entire forum by email. "
"Email addresses are never shown or otherwise shared with anybody else.</p>"
-#: skins/default/templates/authopenid/complete.html:35
+#: skins/default/templates/authopenid/complete.html:38
#, python-format
msgid ""
"register new external %(provider)s account info, see %(gravatar_faq_url)s"
@@ -4521,7 +4680,7 @@ msgstr ""
"retrieve your unique avatar image - <a href='%(gravatar_faq_url)"
"s'><strong>gravatar</strong></a>.</p>"
-#: skins/default/templates/authopenid/complete.html:38
+#: skins/default/templates/authopenid/complete.html:41
#, python-format
msgid "register new Facebook connect account info, see %(gravatar_faq_url)s"
msgstr ""
@@ -4532,25 +4691,25 @@ msgstr ""
"and will be used to create and retrieve your unique avatar image - <a href='%"
"(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>"
-#: skins/default/templates/authopenid/complete.html:42
+#: skins/default/templates/authopenid/complete.html:45
msgid "This account already exists, please use another."
msgstr ""
-#: skins/default/templates/authopenid/complete.html:57
+#: skins/default/templates/authopenid/complete.html:60
msgid "Sorry, looks like we have some errors:"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:82
+#: skins/default/templates/authopenid/complete.html:85
msgid "Screen name label"
msgstr "<strong>Screen Name</strong> (<i>will be shown to others</i>)"
-#: skins/default/templates/authopenid/complete.html:89
+#: skins/default/templates/authopenid/complete.html:92
msgid "Email address label"
msgstr ""
"<strong>Email Address</strong> (<i>will <strong>not</strong> be shared with "
"anyone, must be valid</i>)"
-#: skins/default/templates/authopenid/complete.html:95
+#: skins/default/templates/authopenid/complete.html:98
#: skins/default/templates/authopenid/signup.html:18
msgid "receive updates motivational blurb"
msgstr ""
@@ -4560,37 +4719,37 @@ msgstr ""
"week</strong> - only when there is anything new.<br/>If you like, please "
"adjust this now or any time later from your user account."
-#: skins/default/templates/authopenid/complete.html:99
+#: skins/default/templates/authopenid/complete.html:102
#: skins/default/templates/authopenid/signup.html:22
msgid "please select one of the options above"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:102
+#: skins/default/templates/authopenid/complete.html:105
msgid "Tag filter tool will be your right panel, once you log in."
msgstr ""
-#: skins/default/templates/authopenid/complete.html:103
+#: skins/default/templates/authopenid/complete.html:106
msgid "create account"
msgstr "Signup"
-#: skins/default/templates/authopenid/complete.html:112
+#: skins/default/templates/authopenid/complete.html:115
msgid "Existing account"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:113
+#: skins/default/templates/authopenid/complete.html:116
msgid "user name"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:114
+#: skins/default/templates/authopenid/complete.html:117
msgid "password"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:121
+#: skins/default/templates/authopenid/complete.html:124
msgid "Register"
msgstr ""
-#: skins/default/templates/authopenid/complete.html:122
-#: skins/default/templates/authopenid/signin.html:168
+#: skins/default/templates/authopenid/complete.html:125
+#: skins/default/templates/authopenid/signin.html:182
msgid "Forgot your password?"
msgstr ""
@@ -4727,43 +4886,52 @@ msgstr ""
"* login with user name %(username)s and password %(password)s\n"
"* go to your user profile and set the password to something you can remember"
-#: skins/default/templates/authopenid/signin.html:5
-#: skins/default/templates/authopenid/signin.html:21
+#: skins/default/templates/authopenid/signin.html:6
msgid "User login"
msgstr "User login"
-#: skins/default/templates/authopenid/signin.html:28
+#: skins/default/templates/authopenid/signin.html:24
#, python-format
msgid ""
"\n"
-" Your answer to %(title)s %(summary)s will be posted once you "
-"log in\n"
-" "
+" Your answer to %(title)s %(summary)s will be posted once you log in\n"
+" "
msgstr ""
"\n"
"<span class=\"strong big\">Your answer to </span> <i>\"<strong>%(title)s</"
"strong> %(summary)s...\"</i> <span class=\"strong big\">is saved and will be "
"posted once you log in.</span>"
-#: skins/default/templates/authopenid/signin.html:35
+#: skins/default/templates/authopenid/signin.html:31
#, python-format
msgid ""
"Your question \n"
-" %(title)s %(summary)s will be posted once you log in\n"
-" "
+" %(title)s %(summary)s will be posted once you log in\n"
+" "
msgstr ""
"<span class=\"strong big\">Your question</span> <i>\"<strong>%(title)s</"
"strong> %(summary)s...\"</i> <span class=\"strong big\">is saved and will be "
"posted once you log in.</span>"
-#: skins/default/templates/authopenid/signin.html:42
-msgid "Click to sign in through any of these services."
+#: skins/default/templates/authopenid/signin.html:39
+msgid ""
+"You can use your favorite service from those listed below to sign in using "
+"secure OpenID or similar technology. Your external service password always "
+"stays confidential and you don't have to rememeber or create another one."
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:43
+msgid ""
+"Please add a more permanent login method by clicking one of the icons below, "
+"to avoid logging in via email each time. All of the services listed below "
+"provide a secure sign-in method based on OpenID or similar technology."
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:46
+msgid ""
+"You are already signed in, but if you want to change the login method for "
+"the future use - just click on one of the icons below."
msgstr ""
-"<h2>Please click any of the icons below to sign in.</h2>"
-"<font color=\"gray\">External login services use <a href="
-"\"http://openid.net\"><b>OpenID</b></a> technology, where your password "
-"always stays confidential between you and your login provider and you don't "
-"have to remember another one.</font></p>"
# msgid "Click to sign in through any of these services."
# msgstr ""
@@ -4774,72 +4942,89 @@ msgstr ""
# "have to remember another one. "
# "Askbot option requires your login name and "
# "password entered here.</font></p>"
-#: skins/default/templates/authopenid/signin.html:144
+#: skins/default/templates/authopenid/signin.html:153
msgid "Enter your <span id=\"enter_your_what\">Provider user name</span>"
msgstr ""
-"<h2>Please, enter your </span><span id=\"enter_your_what\" "
-">Provider user name</span>, then sign in.</h2><p><span class='grey'>(or "
-"select another login method above)</span></p>"
+"<h2>Please, enter your </span><span id=\"enter_your_what\" >Provider user "
+"name</span>, then sign in.</h2><p><span class='grey'>(or select another "
+"login method above)</span></p>"
-#: skins/default/templates/authopenid/signin.html:151
+#: skins/default/templates/authopenid/signin.html:156
+#: skins/default/templates/authopenid/signin.html:162
+#: skins/default/templates/authopenid/signin.html:180
+msgid "Login"
+msgstr "Sign in"
+
+#: skins/default/templates/authopenid/signin.html:160
msgid ""
"Enter your <a class=\"openid_logo\" href=\"http://openid.net\">OpenID</a> "
"web address"
msgstr ""
-"<h2>Please, enter your <a class=\"openid_logo\" href=\"http://"
-"openid.net\">OpenID</a> url, then sign in</h2><p><span class='grey'>(or choose "
-"another login method above)</span></p>"
+"<h2>Please, enter your <a class=\"openid_logo\" href=\"http://openid.net"
+"\">OpenID</a> url, then sign in</h2><p><span class='grey'>(or choose another "
+"login method above)</span></p>"
-#: skins/default/templates/authopenid/signin.html:153
#: skins/default/templates/authopenid/signin.html:166
-msgid "Login"
-msgstr "Sign in"
-
-#: skins/default/templates/authopenid/signin.html:157
msgid "Enter your login name and password"
msgstr ""
"<span class='big strong'>Enter your Askbot login and password</span><br/"
"><span class='grey'>(or select your OpenID provider above)</span>"
-#: skins/default/templates/authopenid/signin.html:161
+#: skins/default/templates/authopenid/signin.html:172
msgid "Login name"
msgstr ""
-#: skins/default/templates/authopenid/signin.html:163
+#: skins/default/templates/authopenid/signin.html:176
msgid "Password"
msgstr ""
-#: skins/default/templates/authopenid/signin.html:167
+#: skins/default/templates/authopenid/signin.html:181
msgid "Create account"
msgstr ""
-#: skins/default/templates/authopenid/signin.html:178
+#: skins/default/templates/authopenid/signin.html:191
+msgid "Account recovery email sent"
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:193
+msgid "Still have trouble accessing your account?"
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:198
+msgid "Please, enter your email address below to recover"
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:201
+msgid "Recover your account via email"
+msgstr ""
+
+#: skins/default/templates/authopenid/signin.html:208
msgid "Why use OpenID?"
msgstr ""
-#: skins/default/templates/authopenid/signin.html:181
+#: skins/default/templates/authopenid/signin.html:211
msgid "with openid it is easier"
msgstr "With the OpenID you don't need to create new username and password."
-#: skins/default/templates/authopenid/signin.html:184
+#: skins/default/templates/authopenid/signin.html:214
msgid "reuse openid"
msgstr "You can safely re-use the same login for all OpenID-enabled websites."
-#: skins/default/templates/authopenid/signin.html:187
+#: skins/default/templates/authopenid/signin.html:217
msgid "openid is widely adopted"
msgstr ""
"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-"
"enabled."
-#: skins/default/templates/authopenid/signin.html:190
+#: skins/default/templates/authopenid/signin.html:220
msgid "openid is supported open standard"
msgstr "OpenID is based on an open standard, supported by many organizations."
-#: skins/default/templates/authopenid/signin.html:195
+#: skins/default/templates/authopenid/signin.html:225
msgid "Find out more"
msgstr ""
-#: skins/default/templates/authopenid/signin.html:196
+#: skins/default/templates/authopenid/signin.html:226
msgid "Get OpenID"
msgstr ""
@@ -5052,63 +5237,63 @@ msgstr ""
msgid "We look forward to hearing your feedback! Please, give it next time :)"
msgstr ""
-#: views/readers.py:291
+#: views/readers.py:288
msgid "Sorry, this question has been deleted and is no longer accessible"
msgstr ""
-#: views/users.py:188
+#: views/users.py:216
msgid "moderate user"
msgstr ""
-#: views/users.py:390
+#: views/users.py:419
msgid "user profile"
msgstr ""
-#: views/users.py:391
+#: views/users.py:420
msgid "user profile overview"
msgstr ""
-#: views/users.py:673
+#: views/users.py:702
msgid "recent user activity"
msgstr ""
-#: views/users.py:674
+#: views/users.py:703
msgid "profile - recent activity"
msgstr ""
-#: views/users.py:741
+#: views/users.py:770
msgid "profile - responses"
msgstr ""
-#: views/users.py:805
+#: views/users.py:834
msgid "profile - votes"
msgstr ""
-#: views/users.py:840
+#: views/users.py:869
msgid "user reputation in the community"
msgstr "user karma"
-#: views/users.py:841
+#: views/users.py:870
msgid "profile - user reputation"
msgstr "Profile - User's Karma"
-#: views/users.py:892
+#: views/users.py:921
msgid "users favorite questions"
msgstr ""
-#: views/users.py:893
+#: views/users.py:922
msgid "profile - favorite questions"
msgstr ""
-#: views/users.py:909 views/users.py:913
+#: views/users.py:938 views/users.py:942
msgid "changes saved"
msgstr ""
-#: views/users.py:919
+#: views/users.py:948
msgid "email updates canceled"
msgstr ""
-#: views/users.py:930
+#: views/users.py:959
msgid "profile - email subscriptions"
msgstr ""
@@ -5148,6 +5333,17 @@ msgstr ""
msgid "sorry, we seem to have some technical difficulties"
msgstr ""
+#~ msgid "email update message subject"
+#~ msgstr "news from Q&A forum"
+
+#~ msgid "Click to sign in through any of these services."
+#~ msgstr ""
+#~ "<h2>Please click any of the icons below to sign in.</h2><font color=\"gray"
+#~ "\">External login services use <a href=\"http://openid.net\"><b>OpenID</"
+#~ "b></a> technology, where your password always stays confidential between "
+#~ "you and your login provider and you don't have to remember another one.</"
+#~ "font></p>"
+
#, fuzzy
#~ msgid ""
#~ "\n"
diff --git a/askbot/skins/default/templates/authopenid/signin.html b/askbot/skins/default/templates/authopenid/signin.html
index da766667..1bcdbb1b 100755
--- a/askbot/skins/default/templates/authopenid/signin.html
+++ b/askbot/skins/default/templates/authopenid/signin.html
@@ -40,7 +40,7 @@
</p>
{% endif %}
{% if view_subtype == 'add_openid' %}
- <p>{% trans "Please add a more permanent login method by clicking one of the icons below, to avoioid logging in via email each time. All of the services listed below provide a secure sign-in method based on OpenID or similar technology." %}</p>
+ <p>{% trans "Please add a more permanent login method by clicking one of the icons below, to avoid logging in via email each time. All of the services listed below provide a secure sign-in method based on OpenID or similar technology." %}</p>
{% endif %}
{% if view_subtype == 'change_openid' %}
<p>{% trans "You are already signed in, but if you want to change the login method for the future use - just click on one of the icons below." %}</p>