diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-08-31 21:04:04 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-08-31 21:04:04 -0400 |
commit | d0406081233fb7784d5b006fb182e6fdc92560ba (patch) | |
tree | 61a61dbf24b91d4e4162504d7bd065f8fb963b8e | |
parent | cfc5cf4e2cc2a1cc21d935fd70d545285844f7ad (diff) | |
download | askbot-d0406081233fb7784d5b006fb182e6fdc92560ba.tar.gz askbot-d0406081233fb7784d5b006fb182e6fdc92560ba.tar.bz2 askbot-d0406081233fb7784d5b006fb182e6fdc92560ba.zip |
multiple login methods work, but need better testing
-rw-r--r-- | askbot/__init__.py | 1 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/migrations/0001_initial.py | 171 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/migrations/0002_make_multiple_openids_possible.py | 128 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/migrations/0003_fill_in_provider_names.py | 116 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/migrations/__init__.py | 0 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/models.py | 9 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/util.py | 9 | ||||
-rw-r--r-- | askbot/deps/django_authopenid/views.py | 47 | ||||
-rw-r--r-- | askbot/importers/stackexchange/management/commands/load_stackexchange.py | 2 | ||||
-rw-r--r-- | askbot/locale/en/LC_MESSAGES/django.mo | bin | 25486 -> 24987 bytes | |||
-rw-r--r-- | askbot/locale/en/LC_MESSAGES/django.po | 1044 | ||||
-rwxr-xr-x | askbot/skins/default/templates/authopenid/signin.html | 2 |
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>™', @@ -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 Binary files differindex 892d2f27..39c2b011 100644 --- a/askbot/locale/en/LC_MESSAGES/django.mo +++ b/askbot/locale/en/LC_MESSAGES/django.mo 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>
|