diff options
43 files changed, 6720 insertions, 2553 deletions
diff --git a/development.log b/development.log new file mode 100644 index 00000000..abe1aac0 --- /dev/null +++ b/development.log @@ -0,0 +1,72 @@ +==Aug 5, 2009 Evgeny== +====Interface changes=== +Merged in my code that: +* allows anonymous posting of Q&A and then login +* per-question email notifications via 'send_email_alerts' command +* allows space character in username +* improves openid login +* makes notification messages sticky - have to click "x" to dismiss +* unanswered questions are now those with no accepted answer +* added following setting parameters: + +settings.MIN_USERNAME_LENGTH = 1 +settings.EMAIL_UNIQUE = True|False +settings.EMAIL_VALIDATION = 'on'|'off' #thought of maybe adding other options so type is string +settings.GOOGLE_SITEMAP_CODE = <string> +settings.GOOGLE_ANALYTICS_KEY = <string> + +===Fixes=== +* fixed incorrect answer count issue in question.html +* translated Twittwer stuff in user_preferences.html +* translated question_retag.html, except one phrase +* added Adolfo's python2.4 fix +* fixed template debugging comments so that they don't break page layout +* reorganized header template so that it takes less vertical space + +===Code changes=== +* wrapped template context settings into a single settings dictionary +* on login anonymous session is recorded so that anonymously posted questions (if any) could be found later +* added models: AnonymousQuestion, AnonymousAnswer, EmailFeed (for notifications) +* User model has two new fields email_key - 32 byte hex hash and email_isvalid - boolean + file sql_scripts/update_2009_07_05_EF.sql will make upgrade to the live database +* added auth_processor to context.py which loads notification messages without deleting them + NOTE: default django auth processor must be removed! +* added ajax actions questionSubscribeUpdates/questionUnsubscribeUpdates + +==Aug 4 2009, Evgeny== +===Changes=== +* commented out LocaleMiddleware - language can be now switched with settings.LANGUAGE_CODE +* added DATABASE_ENGINE line to settings_local +===Merges=== +* Adolfo's slugification of urls +* Added Chaitanyas changes for traditional login/signup and INSTALL file + +==July 26 2009, Evgeny== + +django_authopenid: +considerably changed user interface +[comment] - sorry - this is not done yet + +log/forum/forms.py: +* added tag input validation using regex +* fixed bug with date type mismatch near self.fields['birthday'] = + in EditUserForm.__init__() + +/forum/templatetags/extra_tags.py: +* fixed date type mismatch in get_age() + +/templates/content/js/com.cnprog.post.js: +* fixed bug with post deletion/recovery + +javascript: +* changed to use of non-minified code - better for editing +and debugging + +/templates/question.html: +* fixed display of delete/undelete links + +templates: +added comments in the beginning/end of each template +for the debugging purposes - so that you know which template outputs what html +<!-- user_favorites.html --> +<!-- end user_favorites.html --> diff --git a/django_authopenid/util.py b/django_authopenid/util.py index 969af0b9..c7c9d8f3 100644 --- a/django_authopenid/util.py +++ b/django_authopenid/util.py @@ -21,6 +21,7 @@ from models import Association, Nonce __all__ = ['OpenID', 'DjangoOpenIDStore', 'from_openid_response', 'clean_next'] + class OpenID: def __init__(self, openid_, issued, attrs=None, sreg_=None): logging.debug('init janrain openid object') diff --git a/forum/admin.py b/forum/admin.py index 482da048..810ae3d0 100644 --- a/forum/admin.py +++ b/forum/admin.py @@ -46,15 +46,6 @@ class ReputeAdmin(admin.ModelAdmin): class ActivityAdmin(admin.ModelAdmin): """ admin class""" -class BookAdmin(admin.ModelAdmin): - """ admin class""" - -class BookAuthorInfoAdmin(admin.ModelAdmin): - """ admin class""" - -class BookAuthorRssAdmin(admin.ModelAdmin): - """ admin class""" - admin.site.register(Question, QuestionAdmin) admin.site.register(Tag, TagAdmin) @@ -69,6 +60,3 @@ admin.site.register(Badge, BadgeAdmin) admin.site.register(Award, AwardAdmin) admin.site.register(Repute, ReputeAdmin) admin.site.register(Activity, ActivityAdmin) -admin.site.register(Book, BookAdmin) -admin.site.register(BookAuthorInfo, BookAuthorInfoAdmin) -admin.site.register(BookAuthorRss, BookAuthorRssAdmin) diff --git a/forum/auth.py b/forum/auth.py index 1569482f..eb81f853 100644 --- a/forum/auth.py +++ b/forum/auth.py @@ -1,4 +1,4 @@ -""" + """ Authorisation related functions. The actions a User is authorised to perform are dependent on their reputation diff --git a/forum/forms.py b/forum/forms.py index 308f853b..22799622 100644 --- a/forum/forms.py +++ b/forum/forms.py @@ -181,6 +181,7 @@ class EditQuestionForm(forms.Form): tags = TagNamesField() summary = SummaryField() + def __init__(self, question, revision, *args, **kwargs): super(EditQuestionForm, self).__init__(*args, **kwargs) self.fields['title'].initial = revision.title diff --git a/forum/management/commands/send_email_alerts.py b/forum/management/commands/send_email_alerts.py index 62f13d69..5e1eb3d0 100644 --- a/forum/management/commands/send_email_alerts.py +++ b/forum/management/commands/send_email_alerts.py @@ -57,6 +57,7 @@ class Command(NoArgsCommand): q_ans = Q_set.filter(answers__author=user) q_ans.cutoff_time = cutoff_time elif feed.feed_type == 'q_all': + if user.tag_filter_setting == 'ignored': ignored_tags = Tag.objects.filter(user_selections__reason='bad',user_selections__user=user) q_all = Q_set.exclude( tags__in=ignored_tags ) @@ -140,7 +141,6 @@ class Command(NoArgsCommand): output.append(_(string) % {'num':number}) def send_email_alerts(self): - #todo: move this to template for user in User.objects.all(): q_list = self.get_updated_questions_for_user(user) diff --git a/forum/managers.py b/forum/managers.py index 3f580bd3..1705184a 100644 --- a/forum/managers.py +++ b/forum/managers.py @@ -74,6 +74,7 @@ class QuestionManager(models.Manager): Questions with the individual tags will be added to list if above questions are not full. """ #print datetime.datetime.now() + from forum.models import Question questions = list(self.filter(tagnames = question.tagnames, deleted=False).all()) tags_list = question.tags.all() @@ -147,17 +148,22 @@ class TagManager(models.Manager): class AnswerManager(models.Manager): GET_ANSWERS_FROM_USER_QUESTIONS = u'SELECT answer.* FROM answer INNER JOIN question ON answer.question_id = question.id WHERE question.author_id =%s AND answer.author_id <> %s' - def get_answers_from_question(self, question, user=None): + def get_answers_from_question(self, question, user=None, other_orderby = None): """ Retrieves visibile answers for the given question. Delete answers are only visibile to the person who deleted them. - """ - + """ if user is None or not user.is_authenticated(): - return self.filter(question=question, deleted=False) + q = self.filter(question=question, deleted=False) + else: + q = self.filter(Q(question=question), + Q(deleted=False) | Q(deleted_by=user)) + if other_orderby is None: + q = q.order_by("-accepted") else: - return self.filter(Q(question=question), - Q(deleted=False) | Q(deleted_by=user)) + q = q.order_by("-accepted", other_orderby) + + return q def get_answers_from_questions(self, user_id): """ diff --git a/forum/models.py b/forum/models.py index 2da8ef7b..8a24e631 100644 --- a/forum/models.py +++ b/forum/models.py @@ -738,10 +738,10 @@ def record_comment_event(instance, created, **kwargs): from django.contrib.contenttypes.models import ContentType question_type = ContentType.objects.get_for_model(Question) question_type_id = question_type.id - if (instance.content_type_id == question_type_id): + if (instance.content_type_id == question_type_id): type = TYPE_ACTIVITY_COMMENT_QUESTION else: - type = TYPE_ACTIVITY_COMMENT_ANSWER + type=TYPE_ACTIVITY_COMMENT_ANSWER activity = Activity(user=instance.user, active_at=instance.added_at, content_object=instance, activity_type=type) activity.save() diff --git a/forum/skins/default/media/js/com.cnprog.admin.js b/forum/skins/default/media/js/com.cnprog.admin.js index 39dff48c..974dce23 100644 --- a/forum/skins/default/media/js/com.cnprog.admin.js +++ b/forum/skins/default/media/js/com.cnprog.admin.js @@ -3,7 +3,11 @@ $(document).ready( function(){ success: function(a,b){$('.admin #action_status').html($.i18n._('changes saved'));}, dataType:'json', timeout:5000, +<<<<<<< HEAD:templates/content/js/com.cnprog.admin.js + url: $.i18n._('/') + $.i18n._('moderate-user/') + viewUserID + '/' +======= url: scriptUrl + $.i18n._('moderate-user/') + viewUserID + '/' +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/content/js/com.cnprog.admin.js }; var form = $('.admin #moderate_user_form').ajaxForm(options); var box = $('.admin input#id_is_approved').click(function(){ diff --git a/forum/skins/default/media/js/com.cnprog.i18n.js b/forum/skins/default/media/js/com.cnprog.i18n.js index da9bf396..58cb8f16 100644 --- a/forum/skins/default/media/js/com.cnprog.i18n.js +++ b/forum/skins/default/media/js/com.cnprog.i18n.js @@ -59,6 +59,10 @@ var i18nZh = { }; var i18nEn = { +<<<<<<< HEAD:templates/content/js/com.cnprog.i18n.js + '/':'/', +======= +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/content/js/com.cnprog.i18n.js 'need >15 points to report spam':'need >15 points to report spam ', '>15 points requried to upvote':'>15 points required to upvote ', 'tags cannot be empty':'please enter at least one tag', diff --git a/forum/skins/default/media/style/style.css b/forum/skins/default/media/style/style.css index 175fcb66..88c7e7db 100644 --- a/forum/skins/default/media/style/style.css +++ b/forum/skins/default/media/style/style.css @@ -1163,6 +1163,7 @@ ul.bulleta li {background:url(../images/bullet_green.gif) no-repeat 0px 2px; pad .message p { margin-bottom:0px; } + p.space-above { margin-top:10px; } diff --git a/forum/skins/default/templates/ask.html b/forum/skins/default/templates/ask.html index 083b01d9..84253be5 100644 --- a/forum/skins/default/templates/ask.html +++ b/forum/skins/default/templates/ask.html @@ -115,6 +115,13 @@ <p class="title-desc"> {{ form.tags.help_text }} </p> + <p class="form-item"> + <strong>{{ form.categories.label_tag }}:</strong> {% trans "(required)" %} <span class="form-error"></span><br> + {{ form.categories }} {{ form.categories.errors }} + </p> + <p class="title-desc"> + {{ form.categories.help_text }} + </p> {% if not request.user.is_authenticated %} <input type="submit" value="{% trans "Login/signup to post your question" %}" class="submit" /> {% else %} diff --git a/forum/skins/default/templates/authopenid/complete.html b/forum/skins/default/templates/authopenid/complete.html index 62970e38..72dca1a5 100644 --- a/forum/skins/default/templates/authopenid/complete.html +++ b/forum/skins/default/templates/authopenid/complete.html @@ -92,6 +92,7 @@ parameters: {% endif %} {{ form1.email }} </div> + <p class='nomargin'>{% trans "Tag filter tool will be your right panel, once you log in." %}</p> <p>{% trans "receive updates motivational blurb" %}</p> <div class='simple-subscribe-options'> {{email_feeds_form.subscribe}} diff --git a/forum/skins/default/templates/authopenid/confirm_email.txt b/forum/skins/default/templates/authopenid/confirm_email.txt index 3a01f146..0b3b2505 100644 --- a/forum/skins/default/templates/authopenid/confirm_email.txt +++ b/forum/skins/default/templates/authopenid/confirm_email.txt @@ -1,13 +1,13 @@ -{% load i18n %} -{% trans "Thank you for registering at our Q&A forum!" %} +Gracias por registrarse en Hasked.com -{% trans "Your account details are:" %} +Los detalles de su cuenta son: -{% trans "Username:" %} {{ username }} -{% trans "Password:" %} {{ password }} +Nombre de usuario: {{ username }} +Contraseña: {{ password }} {% trans "Please sign in here:" %} {{signup_url}} -{% blocktrans %}Sincerely, -Forum Administrator{% endblocktrans %} +Saludos, +El equipo administrador de Hasked.com + diff --git a/forum/skins/default/templates/authopenid/email_validation.txt b/forum/skins/default/templates/authopenid/email_validation.txt index 5b166a9b..d741614f 100644 --- a/forum/skins/default/templates/authopenid/email_validation.txt +++ b/forum/skins/default/templates/authopenid/email_validation.txt @@ -1,15 +1,13 @@ -{% load i18n %} -{% trans "Greetings from the Q&A forum" %}, +Saludos de Hasked.com, -{% trans "To make use of the Forum, please follow the link below:" %} +Para poder usar Hasked haga click en el siguiente link: {{validation_link}} -{% trans "Following the link above will help us verify your email address." %} +Seguir el link de arriba nos ayuda a verificar su correo electrónico. -{% blocktrans %}If you beleive that this message was sent in mistake - -no further action is needed. Just ingore this email, we apologize -for any inconvenience{% endblocktrans %} +Si cree que este mensaje se mandó por error no se requiere de mas acciones. +Solo ignore este correo, pedimos disculpas por cualquier incoveniente -{% blocktrans %}Sincerely, -Forum Administrator{% endblocktrans %} +Saludos, +Equipo de administración de Hasked.com diff --git a/forum/skins/default/templates/authopenid/sendpw_email.txt b/forum/skins/default/templates/authopenid/sendpw_email.txt index f044ca45..c4910d12 100644 --- a/forum/skins/default/templates/authopenid/sendpw_email.txt +++ b/forum/skins/default/templates/authopenid/sendpw_email.txt @@ -5,5 +5,5 @@ If it were not you, it is safe to ignore this email.{% endblocktrans %} {% blocktrans %}email explanation how to use new {{password}} for {{username}} with the {{key_link}}{% endblocktrans %} -{% blocktrans %}Sincerely, -Forum Administrator{% endblocktrans %} +Saludos, +El Equipo administrador de Hasked.com diff --git a/forum/skins/default/templates/base.html b/forum/skins/default/templates/base.html index 9033b0c9..58ef0627 100755 --- a/forum/skins/default/templates/base.html +++ b/forum/skins/default/templates/base.html @@ -17,6 +17,9 @@ <link href="{% media "/media/style/style.css" %}" rel="stylesheet" type="text/css" /> <script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript">google.load("jquery", "1.2.6");</script> + <script type='text/javascript' src='{% href "/content/js/com.cnprog.i18n.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/jquery.i18n.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/com.cnprog.utils.js" %}'></script> <script type="text/javascript"> var i18nLang = '{{settings.LANGUAGE_CODE}}'; var scriptUrl = '/{{settings.FORUM_SCRIPT_ALIAS}}' diff --git a/forum/skins/default/templates/header.html b/forum/skins/default/templates/header.html index 3afc46c5..3b29ffc4 100644 --- a/forum/skins/default/templates/header.html +++ b/forum/skins/default/templates/header.html @@ -63,3 +63,4 @@ </div> </div> <!-- end template header.html --> + diff --git a/forum/skins/default/templates/index.html b/forum/skins/default/templates/index.html index 7fa189ae..30cba1be 100644 --- a/forum/skins/default/templates/index.html +++ b/forum/skins/default/templates/index.html @@ -24,10 +24,11 @@ <div class="tabBar"> <div class="headQuestions">{% trans "Questions" %}</div> <div class="tabsA"> - <a id="latest" href="{% url questions %}?sort=latest" title="{% trans "last updated questions" %}" >{% trans "newest" %}</a> + <a id="latest" href="{% url questions %}?sort=latest" title="{% trans "last updated questions" %}" >{% trans "newest" %}</a> + <a id="active" href="{% url questions %}?sort=active" title="{% trans "most recently updated questions" %}">{% trans "active" %}</a> <a id="hottest" href="{% url questions %}?sort=hottest" title="{% trans "hottest questions" %}" >{% trans "hottest" %}</a> <a id="mostvoted" href="{% url questions %}?sort=mostvoted" title="{% trans "most voted questions" %}" >{% trans "most voted" %}</a> - <a id="all" href="{% url questions %}" title="{% trans "all questions" %}" >{% trans "all questions" %}</a> + <!--<a id="all" href="{% url questions %}" title="{% trans "all questions" %}" >{% trans "all questions" %}</a>--> </div> </div> <!-- 问题列表 --> diff --git a/forum/skins/default/templates/question.html b/forum/skins/default/templates/question.html index fe9f5cde..ae562b6b 100644 --- a/forum/skins/default/templates/question.html +++ b/forum/skins/default/templates/question.html @@ -1,3 +1,523 @@ +<<<<<<< HEAD:templates/question.html +{% extends "base.html" %} +<!-- question.html --> +{% load extra_tags %} +{% load extra_filters %} +{% load smart_if %} +{% load humanize %} +{% load i18n %} +{% block title %}{% spaceless %}{{ question.get_question_title }}{% endspaceless %}{% endblock %} +{% block forejs %} + <meta name="description" content="{{question.summary}}" /> + <meta name="keywords" content="{{question.tagname_meta_generator}}" /> + <link rel="canonical" href="{{settings.APP_URL}}{{question.get_absolute_url}}" /> + {% if not question.closed %} + <script type='text/javascript' src='{% href "/content/js/com.cnprog.editor.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/wmd/showdown.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/wmd/wmd.js" %}'></script> + <link rel="stylesheet" type="text/css" href="{% href "/content/js/wmd/wmd.css" %}" /> + {% endif %} + <script type='text/javascript' src='{% href "/content/js/com.cnprog.post.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/jquery.validate.pack.js" %}'></script> + + <script type="text/javascript"> + // define reputation needs for comments + var repNeededForComments = 50; + $().ready(function(){ + $("#nav_questions").attr('className',"on"); + var answer_sort_tab = "{{ tab_id }}"; + $("#" + answer_sort_tab).attr('className',"on"); + + Vote.init({{ question.id }}, '{{ question.author.id }}','{{ request.user.id }}'); + + {% if not question.closed and request.user.is_authenticated %}initEditor();{% endif %} + + lanai.highlightSyntax(); + $('#btLogin').bind('click', function(){window.location.href='{% url user_signin %}'; } ) + }); + + function initEditor(){ + $('#editor').TextAreaResizer(); + //highlight code synctax when editor has new text + $("#editor").typeWatch({highlight: false, wait: 3000, + captureLength: 5, callback: lanai.highlightSyntax}); + + var display = true; + var txt = "[{% trans "hide preview" %}]"; + $('#pre-collapse').text(txt); + $('#pre-collapse').bind('click', function(){ + txt = display ? "[{% trans "show preview" %}]" : "[{% trans "hide preview" %}]"; + display = !display; + $('#previewer').toggle(); + $('#pre-collapse').text(txt); + }); + + setupFormValidation("#fmanswer", CPValidator.getQuestionFormRules(), CPValidator.getQuestionFormMessages()); + } + + </script> +{% endblock %} + +{% block content %} +<div class="headNormal"> + <a href="{{ question.get_absolute_url }}">{{ question.get_question_title }}</a> +</div> +<div id="main-body" class=""> + <div id="askform"> + <table style="width:100%;" id="question-table" {% if question.deleted %}class="deleted"{%endif%}> + <tr> + <td style="width:30px;vertical-align:top"> + <div class="vote-buttons"> + {% if question_vote %} + <img id="question-img-upvote-{{ question.id }}" class="question-img-upvote" + {% if question_vote.is_upvote %} + src="{% href "/content/images/vote-arrow-up-on.png" %}" + {% else %} + src="{% href "/content/images/vote-arrow-up.png" %}" + {% endif %} + alt="{% trans "i like this post (click again to cancel)" %}" + title="{% trans "i like this post (click again to cancel)" %}" /> + <div id="question-vote-number-{{ question.id }}" class="vote-number" + title="{% trans "current number of votes" %}"> + {{ question.score }} + </div> + <img id="question-img-downvote-{{ question.id }}" class="question-img-downvote" + {% if question_vote.is_downvote %} + src="{% href "/content/images/vote-arrow-down-on.png" %}" + {% else %} + src="{% href "/content/images/vote-arrow-down.png" %}" + {% endif %} + alt="{% trans "i dont like this post (click again to cancel)" %}" + title="{% trans "i dont like this post (click again to cancel)" %}" /> + + {% else %} + <img id="question-img-upvote-{{ question.id }}" class="question-img-upvote" + alt="{% trans "i like this post (click again to cancel)" %}" + src="{% href "/content/images/vote-arrow-up.png" %}" + title="{% trans "i like this post (click again to cancel)" %}" /> + <div id="question-vote-number-{{ question.id }}" class="vote-number" + title="{% trans "current number of votes" %}"> + {{ question.score }} + </div> + <img id="question-img-downvote-{{ question.id }}" class="question-img-downvote" + src="{% href "/content/images/vote-arrow-down.png" %}" + alt="{% trans "i dont like this post (click again to cancel)" %}" + title="{% trans "i dont like this post (click again to cancel)" %}" /> + + {% endif %} + {% if favorited %} + <img class="question-img-favorite" src="{% href "/content/images/vote-favorite-on.png" %}" + alt="{% trans "mark this question as favorite (click again to cancel)" %}" + title="{% trans "mark this question as favorite (click again to cancel)" %}" /> + <div id="favorite-number" class="favorite-number my-favorite-number"> + {{ question.favourite_count }} + </div> + {% else %} + <img class="question-img-favorite" src="{% href "/content/images/vote-favorite-off.png" %}" + alt="{% trans "remove favorite mark from this question (click again to restore mark)" %}" + title="{% trans "remove favorite mark from this question (click again to restore mark)" %}" /> + <div id="favorite-number" class="favorite-number"> + {% ifnotequal question.favourite_count 0 %}{{ question.favourite_count }}{% endifnotequal %} + </div> + + {% endif %} + + </div> + </td> + <td> + <div id="item-right"> + <div class="question-body"> + {{ question.html|safe }} + </div> + <div id="question-controls" class="post-controls"> + <div id="question-tags" class="tags"> + {% for tag in question.tagname_list %} + <a href="{% url forum.views.tag tag|urlencode %}" class="post-tag" + title="{% blocktrans with tag as tagname %}see questions tagged '{{ tagname }}'{% endblocktrans %}" rel="tag">{{ tag }}</a> + {% endfor %} + </div> + {% joinitems using '<span class="action-link-separator">|</span>' %} + {% if request.user|can_edit_post:question %} + <span class="action-link"><a href="{% url edit_question question.id %}">{% trans 'edit' %}</a></span> + {% endif %} + {% separator %} + {% if question.closed %} + {% if request.user|can_reopen_question:question %} + <span class="action-link"><a href="{% url reopen question.id %}">{% trans "reopen" %}</a></span> + {% endif %} + {% else %} + {% if request.user|can_close_question:question %} + <span class="action-link"><a href="{% url close question.id %}">{% trans "close" %}</a></span> + {% endif %} + {% endif %} + {% separator %} + {% if request.user|can_flag_offensive %} + <span id="question-offensive-flag-{{ question.id }}" class="offensive-flag" + title="{% trans "report as offensive (i.e containing spam, advertising, malicious text, etc.)" %}"> + <a>{% trans "flag offensive" %}</a> + {% if request.user|can_view_offensive_flags and question.offensive_flag_count %} + <span class="darkred">({{ question.offensive_flag_count }})</span> + {% endif %} + </span> + {% endif %} + {% separator %} + {% if request.user|can_delete_post:question %} + <span class="action-link"><a id="question-delete-link-{{question.id}}">{% trans "delete" %}</a></span> + {% endif %} + {% endjoinitems %} + </div> + <div class="post-update-info-container"> + {% post_contributor_info question "original_author" %} + {% post_contributor_info question "last_updater" %} + </div> + <div class="comments-container" id="comments-container-question-{{question.id}}"> + {% for comment in question.get_comments|slice:":5" %} + <p class="comment" id="comment-{{comment.id}}"> + {{comment.comment}} + - <a class="comment-user" href="{{comment.user.get_profile_url}}">{{comment.user}}</a> + {% spaceless %} + <span class="comment-age">({% diff_date comment.added_at %})</span> + {% if request.user|can_delete_comment:comment %} + <img class="delete-icon" + src="{% href "/content/images/close-small.png" %}" + title="{% trans "delete this comment" %}"/> + {% endif %} + {% endspaceless %} + </p> + {% endfor %} + </div> + <div class="post-comments" style="margin-bottom:20px"> + <input id="can-post-comments-question-{{question.id}}" type="hidden" value="{{ request.user|can_add_comments:question }}"/> + {% if request.user|can_add_comments:question or question.comment_count > 5 %} + <a id="comments-link-question-{{question.id}}" class="comments-link"> + {% if request.user|can_add_comments:question %} + {% trans "add comment" %} + {% endif %} + {% if question.comment_count > 5 %} + {% if request.user|can_add_comments:question %}/ + {% blocktrans count question.get_comments|slice:"5:"|length as counter %} + see <strong>one</strong> more + {% plural %} + see <strong>{{counter}}</strong> more + {% endblocktrans %} + {% else %} + {% blocktrans count question.get_comments|slice:"5:"|length as counter %} + see <strong>one</strong> more comment + {% plural %} + see <strong>{{counter}}</strong> more comments + {% endblocktrans %} + {% endif %} + {% endif %}</a> + {% endif %} + </div> + </div> + + </td> + </tr> + </table> + {% if question.closed %} + <div class="question-status" style="margin-bottom:15px"> + <h3>{% blocktrans with question.get_close_reason_display as close_reason %}The question has been closed for the following reason "{{ close_reason }}" by{% endblocktrans %} + <a href="{{ question.closed_by.get_profile_url }}">{{ question.closed_by.username }}</a> + {% blocktrans with question.closed_at as closed_at %}close date {{closed_at}}{% endblocktrans %}</h3> + </div> + {% endif %} + {% if answers %} + <hr/> + <div class="tabBar"> + <a name="sort-top"></a> + <div class="headQuestions"> + {% blocktrans count answers|length as counter %} + One Answer: + {% plural %} + {{counter}} Answers: + {% endblocktrans %} + </div> + <div class="tabsA"> + <a id="oldest" href="{% url question question.id %}?sort=oldest#sort-top" + title="{% trans "oldest answers will be shown first" %}">{% trans "oldest answers" %}</a> + <a id="latest" href="{% url question question.id %}?sort=latest#sort-top" + title="{% trans "newest answers will be shown first" %}">{% trans "newest answers" %}</a> + <a id="votes" href="{% url question question.id %}?sort=votes#sort-top" + title="{% trans "most voted answers will be shown first" %}">{% trans "popular answers" %}</a> + </div> + </div> + {% cnprog_paginator context %} + + {% for answer in answers %} + <a name="{{ answer.id }}"></a> + <div id="answer-container-{{ answer.id }}" class="answer {% if answer.accepted %}accepted-answer{% endif %} {% ifequal answer.author_id question.author_id %} answered-by-owner{% endifequal %} {% if answer.deleted %}deleted{% endif %}"> + <table style="width:100%;"> + <tr> + <td style="width:30px;vertical-align:top"> + <div class="vote-buttons"> + <img id="answer-img-upvote-{{ answer.id }}" class="answer-img-upvote" + src="{% blockresource %}/content/images/vote-arrow-up{% get_user_vote_image user_answer_votes answer.id 1 %}.png{% endblockresource %}" + alt="{% trans "i like this answer (click again to cancel)" %}" + title="{% trans "i like this answer (click again to cancel)" %}"/> + <div id="answer-vote-number-{{ answer.id }}" class="vote-number" title="{% trans "current number of votes" %}"> + {{ answer.score }} + </div> + <img id="answer-img-downvote-{{ answer.id }}" class="answer-img-downvote" + src="{% blockresource %}/content/images/vote-arrow-down{% get_user_vote_image user_answer_votes answer.id -1 %}.png{% endblockresource %}" + alt="{% trans "i dont like this answer (click again to cancel)" %}" + title="{% trans "i dont like this answer (click again to cancel)" %}" /> + + {% ifequal request.user question.author %} + <img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept" + src="{% blockresource %}/content/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockresource %}" + alt="{% trans "mark this answer as favorite (click again to undo)" %}" + title="{% trans "mark this answer as favorite (click again to undo)" %}" /> + {% else %} + {% if answer.accepted %} + <img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept" + src="{% blockresource %}/content/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockresource %}" + alt="{% trans "the author of the question has selected this answer as correct" %}" + title="{% trans "the author of the question has selected this answer as correct" %}" /> + {% endif %} + {% endifequal %} + </div> + </td> + <td> + <div class="item-right"> + <div class="answer-body"> + {{ answer.html|safe }} + </div> + <div class="answer-controls post-controls"> + {% joinitems using '<span class="action-link-separator">|</span>' %} + <span class="linksopt"> + <a href="#{{ answer.id }}" title="{% trans "answer permanent link" %}"> + {% trans "permanent link" %} + </a> + </span> + {% separator %} + {% if request.user|can_edit_post:answer %} + <span class="action-link"><a href="{% url edit_answer answer.id %}">{% trans 'edit' %}</a></span> + {% endif %} + {% separator %} + + {% if request.user|can_flag_offensive %} + <span id="answer-offensive-flag-{{ answer.id }}" class="offensive-flag" + title="{% trans "report as offensive (i.e containing spam, advertising, malicious text, etc.)" %}"> + <a>{% trans "flag offensive" %}</a> + {% if request.user|can_view_offensive_flags and answer.offensive_flag_count %} + <span class="darkred">({{ answer.offensive_flag_count }})</span> + {% endif %} + </span> + {% endif %} + {% separator %} + {% if request.user|can_delete_post:answer %} + {% spaceless %} + <span class="action-link"> + <a id="answer-delete-link-{{answer.id}}"> + {% if answer.deleted %}{% trans "undelete" %}{% else %}{% trans "delete" %}{% endif %}</a> + </span> + {% endspaceless %} + {% endif %} + {% endjoinitems %} + </div> + <div class="post-update-info-container"> + {% post_contributor_info answer "original_author" %} + {% post_contributor_info answer "last_updater" %} + </div> + <div class="comments-container" id="comments-container-answer-{{answer.id}}"> + {% for comment in answer.get_comments|slice:":5" %} + <p id="comment-{{comment.id}}" class="comment"> + {{comment.comment}} + - <a class="comment-user" href="{{comment.user.get_profile_url}}">{{comment.user}}</a> + {% spaceless %} + <span class="comment-age">({% diff_date comment.added_at %})</span> + {% if request.user|can_delete_comment:comment %} + <img class="delete-icon" + src="{% href "/content/images/close-small.png" %}" + title="{% trans "delete this comment" %}"/> + {% endif %} + {% endspaceless %} + </p> + {% endfor %} + </div> + <div class="post-comments" style="margin-bottom:20px"> + <input id="can-post-comments-answer-{{answer.id}}" type="hidden" value="{{ request.user|can_add_comments:answer}}"/> + {% if request.user|can_add_comments:answer or answer.comment_count > 5 %} + <a id="comments-link-answer-{{answer.id}}" class="comments-link"> + {% if request.user|can_add_comments:answer %} + {% trans "add comment" %} + {% endif %} + {% if answer.comment_count > 5 %} + {% if request.user|can_add_comments:answer %}/ + {% blocktrans count answer.get_comments|slice:"5:"|length as counter %} + see <strong>one</strong> more + {% plural %} + see <strong>{{counter}}</strong> more + {% endblocktrans %} + {% else %} + {% blocktrans count answer.get_comments|slice:"5:"|length as counter %} + see <strong>one</strong> more comment + {% plural %} + see <strong>{{counter}}</strong> more comments + {% endblocktrans %} + {% endif %} + {% endif %}</a> + {% endif %} + </div> + </div> + <div id="comment-{{ answer.id }}" class="post-comments" > + <input id="can-post-comments-answer-{{answer.id}}" type="hidden" value="{{ request.user|can_add_comments }}"/> + <a id="comments-link-answer-{{answer.id}}" class="comments-link"> + {% if answer.comment_count %}{% trans "comments" %} + <strong>({{answer.comment_count}})</strong>{% else %}{% trans "add comment" %}{% endif %}</a> + <div id="comments-answer-{{answer.id}}" class="comments-container"> + <div class="comments"/></div> + + </td> + </tr> + </table> + </div> + {% endfor %} + <div class="paginator-container-left"> + {% cnprog_paginator context %} + </div> + {% endif %} + <form id="fmanswer" action="{% url answer question.id %}" method="post"> + {% if request.user.is_authenticated %} + <p style="padding-left:3px"> + {{ answer.email_notify }} + <label for="question-subscribe-updates"> + {% ifequal request.user.get_q_sel_email_feed_frequency 'n' %} + {% trans "Notify me once a day when there are any new answers" %} + {% else %} + {% ifequal request.user.get_q_sel_email_feed_frequency 'd' %} + {% trans "Notify me once a day when there are any new answers" %} + {% else %} + {% ifequal request.user.get_q_sel_email_feed_frequency 'w' %} + {% trans "Notify me weekly when there are any new answers" %} + {% endifequal %} + {% endifequal %} + {% endifequal %} + </label> + {% blocktrans with request.user.get_profile_url as profile_url %} + You can always adjust frequency of email updates from your {{profile_url}} + {% endblocktrans %} + </p> + {% else %} + <p style="padding-left:3px"> + <input class="nomargin" type="checkbox" disabled="disabled" /> + <label>{% trans "once you sign in you will be able to subscribe for any updates here" %}</label> + </p> + {% endif %} + <div style="clear:both"> + </div> + + {% if not question.closed %} + <div style="padding:10px 0 0 0;"> + {% spaceless %} + <div class="headNormal"> + {% if answers %} + {% trans "Your answer" %} + {% else %} + {% trans "Be the first one to answer this question!" %} + {% endif %} + </div> + {% endspaceless %} + </div> + {% if not request.user.is_authenticated %} + <div class="message">{% trans "you can answer anonymously and then login" %}</div> + {% else %} + <p class="message"> + {% ifequal request.user question.author %} + {% trans "answer your own question only to give an answer" %} + {% else %} + {% trans "please only give an answer, no discussions" %} + {% endifequal %} + </p> + {% endif %} + + <div id="description" class="" > + <div id="wmd-button-bar" class="wmd-panel"></div> + {{ answer.text }} + <div class="preview-toggle"> + <table width="100%"> + <tr> + <td> + <span id="pre-collapse" + title="{% trans "Toggle the real time Markdown editor preview" %}"> + {% trans "toggle preview" %} + </span> + </td> + {% if settings.WIKI_ON %} + <td style="text-align:right;"> + {{ answer.wiki }} + <span style="font-weight:normal;cursor:help" + title="{{answer.wiki.help_text}}"> + {{ answer.wiki.label_tag }} + </span> + </td> + {% endif %} + </tr> + + </table> + </div> + <div id="previewer" class="wmd-preview"></div> + {{ answer.text.errors }} + </div> + <p><span class="form-error"></span></p> + <input type="submit" + {% if user.is_anonymous %} + value="{% trans "Login/Signup to Post Your Answer" %}" + {% else %} + {% if user == question.author %} + value="{% trans "Answer Your Own Question" %}" + {% else %} + value="{% trans "Answer the question" %}" + {% endif %} + {% endif %} + class="submit" style="float:left"/> + {% endif %} + </form> + </div> +</div> +{% endblock %} + +{% block sidebar %} +<div class="boxC"> + <p> + {% trans "Question tags" %}: + </p> + <p class="tags" > + {% for tag in tags %} + <a href="{% url forum.views.tag tag.name|urlencode %}" + title="{% trans "see questions tagged"%}'{{tag.name}}'{% trans "using tags" %}" + rel="tag">{{ tag.name }}</a> <span class="tag-number">×{{ tag.used_count|intcomma }}</span><br/> + {% endfor %} + </p> + <p> + {% trans "question asked" %}: <strong title="{{ question.added_at }}">{% diff_date question.added_at %}</strong> + </p> + <p> + {% trans "question was seen" %}: <strong>{{ question.view_count|intcomma }} {% trans "times" %}</strong> + </p> + <p> + {% trans "last updated" %}: <strong title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</strong> + </p> +</div> + +<div class="boxC"> + <h3 class="subtitle">{% trans "Related questions" %}</h3> + <div class="questions-related"> + {% for question in similar_questions %} + <p> + <a href="{{ question.get_absolute_url }}">{{ question.get_question_title }}</a> + </p> + {% endfor %} + </div> +</div> + +{% endblock %} + +{% block endjs %} +{% endblock %} +<!-- end question.html --> +======= {% extends "base.html" %}
<!-- question.html -->
{% load extra_tags %}
@@ -506,3 +1026,4 @@ {% block endjs %}
{% endblock %}
<!-- end question.html -->
+>>>>>>> evgenyfadeev/master:templates/question.html diff --git a/forum/skins/default/templates/question_edit.html b/forum/skins/default/templates/question_edit.html index fe711849..5a6268c9 100644 --- a/forum/skins/default/templates/question_edit.html +++ b/forum/skins/default/templates/question_edit.html @@ -114,6 +114,12 @@ <div class="title-desc"> {{ form.summary.help_text }} </div> + <br> + + <p class="form-item"> + <strong>{{ form.categories.label_tag }}:</strong> {% trans "(required)" %} <span class="form-error"></span><br> + {{ form.categories }} {{ form.categories.errors }} + </p> <div class="error" ></div> <input type="submit" value="{% trans "Save edit" %}" class="submit" /> <input type="button" value="{% trans "Cancel" %}" class="submit" onclick="history.back(-1);" /> diff --git a/forum/skins/default/templates/questions.html b/forum/skins/default/templates/questions.html index 4c3b96d2..2e593f90 100644 --- a/forum/skins/default/templates/questions.html +++ b/forum/skins/default/templates/questions.html @@ -1,3 +1,277 @@ +<<<<<<< HEAD:templates/questions.html +{% extends "base.html" %} +<!-- questions.html --> +{% load extra_tags %} +{% load i18n %} +{% load humanize %} +{% load extra_filters %} +{% load smart_if %} +{% block title %}{% spaceless %}{% trans "Questions" %}{% endspaceless %}{% endblock %} +{% block forejs %} + <script type="text/javascript"> + var tags = {{ tags_autocomplete|safe }}; + $().ready(function(){ + var tab_id = "{{ tab_id }}"; + $("#"+tab_id).attr('className',"on"); + var on_tab = {% if is_unanswered %}'#nav_unanswered'{% else %}'#nav_questions'{% endif %}; + $(on_tab).attr('className','on'); + Hilite.exact = false; + Hilite.elementid = "listA"; + Hilite.debug_referrer = location.href; + }); + </script> + <script type='text/javascript' src='{% href "/content/js/com.cnprog.editor.js" %}'></script> + <script type='text/javascript' src='{% href "/content/js/com.cnprog.tag_selector.js" %}'></script> +{% endblock %} +{% block content %} +<div class="tabBar"> +<<<<<<< HEAD:templates/questions.html + <div class="headQuestions">{% if searchtag %}{% trans "Found by tags" %}{% else %}{% if searchtitle %}{% trans "Found by title" %}{% else %}{% trans "All questions" %}{% endif %}{% endif %}</div> +======= + <div class="headQuestions"> + {% if searchtag %} + {% trans "Found by tags" %} + {% else %} + {% if searchtitle %} + {% if settings.USE_SPHINX_SEARCH %} + {% trans "Search results" %} + {% else %} + {% trans "Found by title" %} + {% endif %} + {% else %} + {% if is_unanswered %} + {% trans "Unanswered questions" %} + {% else %} + {% trans "All questions" %} + {% endif %} + {% endif %} + {% endif %} + </div> +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/questions.html + <div class="tabsA"> + <a id="latest" href="?sort=latest" class="off" title="{% trans "most recently asked questions" %}">{% trans "newest" %}</a> + <a id="active" href="?sort=active" class="off" title="{% trans "most recently updated questions" %}">{% trans "active" %}</a> + <a id="hottest" href="?sort=hottest" class="off" title="{% trans "hottest questions" %}">{% trans "hottest" %}</a> + <a id="mostvoted" href="?sort=mostvoted" class="off" title="{% trans "most voted questions" %}">{% trans "most voted" %}</a> + </div> +</div> +<div id="listA"> + {% for question in questions.object_list %} + <div class="qstA" + {% if request.user.is_authenticated %} + {% if question.interesting_score > 0 %} + style="background:#ffff99;" + {% else %} + {% if not request.user.hide_ignored_questions %} + {% if question.ignored_score > 0 %} + style="background:#f3f3f3;" + {% endif %} + {% endif %} + {% endif %} + {% endif %} + > + <h2> + <a href="{{ question.get_absolute_url }}">{{ question.get_question_title }}</a> + </h2> + <div class="stat"> + <table> + <tr> + <td><span class="num">{{ question.answer_count|intcomma }}</span> </td> + <td><span class="num">{{ question.score|intcomma }}</span> </td> + <td><span class="num">{{ question.view_count|cnprog_intword|safe }}</span> </td> + </tr> + <tr> + <td><span class="unit">{% trans "answers" %}</span></td> + <td><span class="unit">{% trans "votes" %}</span></td> + <td><span class="unit">{% trans "views" %}</span></td> + </tr> + </table> + </div> + + <div class="summary"> + {{ question.summary }}... + </div> + + {% ifequal tab_id 'active'%} + {% if question.wiki and settings.WIKI_ON %} + <span class="from wiki">{% trans "community wiki" %}</span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% else %} + <div class="from"> + {% comment %}{% gravatar question.last_activity_by 24 %}{% endcomment %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + </div> + {% endif %} + {% else %} + {% if question.wiki and settings.WIKI_ON %} + <span class="from wiki">{% trans "community wiki" %}</span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% else %} + <div class="from"> + {% comment %}{% gravatar question.author 24 %}{% endcomment %} + {% if question.last_activity_at != question.added_at %} + {% if question.author.id != question.last_activity_by.id %} + {% trans "Posted:" %} + <span class="author"><a href="{{ question.author.get_profile_url }}">{{ question.author }}</a></span> + <span class="score">{% get_score_badge question.author %} </span> + / {% trans "Updated:" %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + {% else %} + {% trans "Updated:" %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + {% endif %} + {% else %} + {% trans "Posted:" %} + <span class="author"><a href="{{ question.author.get_profile_url }}">{{ question.author }}</a></span> + <span class="score">{% get_score_badge question.author %} </span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% endif %} + </div> + {% endif %} + {% endifequal %} + + <div class="tags"> + {% for tag in question.tagname_list %} + <a href="{% url forum.views.tag tag|urlencode %}" title="{% trans "see questions tagged" %}'{{ tag }}'{% trans "using tags" %}" rel="tag">{{ tag }}</a> + {% endfor %} + </div> + {%trans "Category: "%}<a href="{% url forum.views.category question.category|urlencode %}">{{ question.category}}</a> + </div> + {% endfor %} + {% if searchtitle %} + {% if questions_count == 0 %} + <p class="evenMore" style="padding-top:30px;text-align:center;"> + {% trans "Did not find anything?" %} + {% else %} + <p class="evenMore" style="padding-left:9px"> + {% trans "Did not find what you were looking for?" %} + {% endif %} + <a href="{% url ask %}">{% trans "Please, post your question!" %}</a> + </p> + {% endif %} +</div> +{% endblock %} + +{% block tail %} + <div class="pager">{% cnprog_paginator context %}</div> + <div class="pagesize">{% cnprog_pagesize context %}</div> +{% endblock %} + +{% block sidebar %} +<div class="boxC"> + {% if searchtag %} +<<<<<<< HEAD:templates/questions.html + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num and searchtag as tagname %} + have total {{q_num}} questions tagged {{tagname}} + {% plural %} + have total {{q_num}} questions tagged {{tagname}} + {% endblocktrans %} + {% else %} + {% if searchtitle %} + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions containing {{searchtitle}} + {% plural %} + have total {{q_num}} questions containing {{searchtitle}} + {% endblocktrans %} + {% else %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions + {% plural %} + have total {{q_num}} questions + {% endblocktrans %} + {% endif %} + {% endif %} + <p> +======= + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num and searchtag as tagname %} + have total {{q_num}} questions tagged {{tagname}} + {% plural %} + have total {{q_num}} questions tagged {{tagname}} + {% endblocktrans %} + {% else %} + {% if searchtitle %} + {% if settings.USE_SPHINX_SEARCH %} + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions containing {{searchtitle}} in full text + {% plural %} + have total {{q_num}} questions containing {{searchtitle}} in full text + {% endblocktrans %} + {% else %} + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions containing {{searchtitle}} + {% plural %} + have total {{q_num}} questions containing {{searchtitle}} + {% endblocktrans %} + {% endif %} + {% else %} + {% if is_unanswered %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} unanswered questions + {% plural %} + have total {{q_num}} unanswered questions + {% endblocktrans %} + {% else %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions + {% plural %} + have total {{q_num}} questions + {% endblocktrans %} + {% endif %} + {% endif %} + {% endif %} + <p class="nomargin"> +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/questions.html + {% ifequal tab_id "latest" %} + {% trans "latest questions info" %} + {% endifequal %} + + {% ifequal tab_id "active" %} + {% trans "Questions are sorted by the <strong>time of last update</strong>." %} + {% trans "Most recently answered ones are shown first." %} + {% endifequal %} + + {% ifequal tab_id "hottest" %} + {% trans "Questions sorted by <strong>number of responses</strong>." %} + {% trans "Most answered questions are shown first." %} + {% endifequal %} + + {% ifequal tab_id "mostvoted" %} + {% trans "Questions are sorted by the <strong>number of votes</strong>." %} + {% trans "Most voted questions are shown first." %} + {% endifequal %} + </p> +</div> +{% if request.user.is_authenticated %} +{% include "tag_selector.html" %} +{% endif %} +<div class="boxC"> + <h3 class="subtitle">{% trans "Related tags" %}</h3> + <div class="tags"> + {% for tag in tags %} +<<<<<<< HEAD:templates/questions.html + <a rel="tag" title="{% trans "see questions tagged" %}'{{ tag.name }}'{% trans "using tags" %}" href="{% url forum.views.tag tag.name|urlencode %}">{{ tag.name }}</a> + <span class="tag-number">× {{ tag.used_count|intcomma }}</span> + <br /> + {% endfor %} + <br /> +======= + <a rel="tag" title="{% blocktrans with tag.name as tag_name %}see questions tagged '{{ tag_name }}'{% endblocktrans %}" href="{% url forum.views.tag tag.name|urlencode %}">{{ tag.name }}</a> + <span class="tag-number">× {{ tag.used_count|intcomma }}</span> + <br /> + {% endfor %} +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/questions.html + </div> +</div> + +{% endblock %} +<!-- end questions.html --> +======= {% extends "base.html" %}
<!-- questions.html -->
{% load extra_tags %}
@@ -233,3 +507,4 @@ {% endblock %}
<!-- end questions.html -->
+>>>>>>> evgenyfadeev/master:templates/questions.html diff --git a/forum/skins/default/templates/user_email_subscriptions.html b/forum/skins/default/templates/user_email_subscriptions.html index c0204cbc..10440529 100644 --- a/forum/skins/default/templates/user_email_subscriptions.html +++ b/forum/skins/default/templates/user_email_subscriptions.html @@ -13,9 +13,12 @@ {% endif %} <form method="POST"> {% include "edit_user_email_feeds_form.html" %} +<<<<<<< HEAD:templates/user_email_subscriptions.html +======= <table class='form-as-table'> {{tag_filter_selection_form}} </table> +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:templates/user_email_subscriptions.html <div class="submit-row text-align-right"> <input type="submit" class="submit" name="save" value="{% trans "Update" %}"/> <input type="submit" class="submit" name="stop_email" value="{% trans "Stop sending email" %}"/> diff --git a/forum/skins/default/templates/user_info.html b/forum/skins/default/templates/user_info.html index c550e13f..4ebcddd6 100644 --- a/forum/skins/default/templates/user_info.html +++ b/forum/skins/default/templates/user_info.html @@ -19,7 +19,7 @@ <tr> <td align="center"> <div class="scoreNumber">{{view_user.reputation|intcomma}}</div> - <p><b style="color:#777;">{% trans "reputation" %}</b></p> + <p><b style="color:#777;">{% trans "karma" %}</b></p> </td> </tr> </table> diff --git a/forum/templatetags/extra_filters.py b/forum/templatetags/extra_filters.py index 22ec0109..865cd33d 100644 --- a/forum/templatetags/extra_filters.py +++ b/forum/templatetags/extra_filters.py @@ -1,5 +1,8 @@ from django import template +<<<<<<< HEAD:forum/templatetags/extra_filters.py +======= from django.core import serializers +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:forum/templatetags/extra_filters.py from forum import auth import logging @@ -92,7 +95,10 @@ def cnprog_intword(number): return number except: return number +<<<<<<< HEAD:forum/templatetags/extra_filters.py +======= @register.filter def json_serialize(object): return serializers.serialize('json',object) +>>>>>>> 82d35490db90878f013523c4d1a5ec3af2df8b23:forum/templatetags/extra_filters.py diff --git a/forum/views.py b/forum/views.py new file mode 100644 index 00000000..2ca4202e --- /dev/null +++ b/forum/views.py @@ -0,0 +1,2410 @@ +# encoding:utf-8 +import calendar +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404 +from django.core.paginator import Paginator, EmptyPage, InvalidPage +from django.template import RequestContext, loader +from django.utils.html import * +from django.utils import simplejson +from django.core import serializers +from django.core.mail import mail_admins +from django.db import transaction +from django.db.models import Count, Q +from django.contrib.contenttypes.models import ContentType +from django.utils.translation import ugettext as _ +from django.utils.datastructures import SortedDict +from django.template.defaultfilters import slugify +from django.core.exceptions import PermissionDenied + +from utils.html import sanitize_html +from utils.decorators import ajax_method, ajax_login_required +from markdown2 import Markdown +import os.path +import random +import time + +import datetime +from forum import auth +from forum.auth import * +from forum.const import * +from forum.diff import textDiff as htmldiff +from forum.forms import * +from forum.models import * +from forum.user import * +from forum import auth +from utils.forms import get_next_url + +# used in index page +INDEX_PAGE_SIZE = 20 +INDEX_AWARD_SIZE = 15 +INDEX_TAGS_SIZE = 100 +# used in tags list +DEFAULT_PAGE_SIZE = 60 +# used in questions +QUESTIONS_PAGE_SIZE = 10 +# used in users +USERS_PAGE_SIZE = 35 +# used in answers +ANSWERS_PAGE_SIZE = 10 +markdowner = Markdown(html4tags=True) +question_type = ContentType.objects.get_for_model(Question) +answer_type = ContentType.objects.get_for_model(Answer) +comment_type = ContentType.objects.get_for_model(Comment) +question_revision_type = ContentType.objects.get_for_model(QuestionRevision) +answer_revision_type = ContentType.objects.get_for_model(AnswerRevision) +repute_type = ContentType.objects.get_for_model(Repute) +question_type_id = question_type.id +answer_type_id = answer_type.id +comment_type_id = comment_type.id +question_revision_type_id = question_revision_type.id +answer_revision_type_id = answer_revision_type.id +repute_type_id = repute_type.id +def _get_tags_cache_json(): + tags = Tag.objects.filter(deleted=False).all() + tags_list = [] + for tag in tags: + dic = {'n': tag.name, 'c': tag.used_count} + tags_list.append(dic) + tags = simplejson.dumps(tags_list) + return tags + +def _get_and_remember_questions_sort_method(request, view_dic, default): + if default not in view_dic: + raise Exception('default value must be in view_dic') + + q_sort_method = request.REQUEST.get('sort', None) + if q_sort_method == None: + q_sort_method = request.session.get('questions_sort_method', default) + + if q_sort_method not in view_dic: + q_sort_method = default + request.session['questions_sort_method'] = q_sort_method + return q_sort_method, view_dic[q_sort_method] + +def index(request): + view_dic = { + "latest":"-last_activity_at", + "hottest":"-answer_count", + "mostvoted":"-score", + } + view_id, orderby = _get_and_remember_questions_sort_method(request, view_dic, 'latest') + + page_size = request.session.get('pagesize', QUESTIONS_PAGE_SIZE) + questions = Question.objects.exclude(deleted=True).order_by(orderby)[:page_size] + # RISK - inner join queries + questions = questions.select_related() + tags = Tag.objects.get_valid_tags(INDEX_TAGS_SIZE) + + awards = Award.objects.get_recent_awards() + + (interesting_tag_names, ignored_tag_names) = (None, None) + if request.user.is_authenticated(): + pt = MarkedTag.objects.filter(user=request.user) + interesting_tag_names = pt.filter(reason='good').values_list('tag__name', flat=True) + ignored_tag_names = pt.filter(reason='bad').values_list('tag__name', flat=True) + + tags_autocomplete = _get_tags_cache_json() + + return render_to_response('index.html', { + 'interesting_tag_names': interesting_tag_names, + 'tags_autocomplete': tags_autocomplete, + 'ignored_tag_names': ignored_tag_names, + "questions" : questions, + "tab_id" : view_id, + "tags" : tags, + "awards" : awards[:INDEX_AWARD_SIZE], + }, context_instance=RequestContext(request)) + +def about(request): + return render_to_response('about.html', context_instance=RequestContext(request)) + +def faq(request): + data = { + 'gravatar_faq_url': reverse('faq') + '#gravatar', + 'send_email_key_url': reverse('send_email_key'), + 'ask_question_url': reverse('ask'), + } + return render_to_response('faq.html', data, context_instance=RequestContext(request)) + +def feedback(request): + data = {} + form = None + if request.method == "POST": + form = FeedbackForm(request.POST) + if form.is_valid(): + if not request.user.is_authenticated: + data['email'] = form.cleaned_data.get('email',None) + data['message'] = form.cleaned_data['message'] + data['name'] = form.cleaned_data.get('name',None) + message = render_to_response('feedback_email.txt',data,context_instance=RequestContext(request)) + mail_admins(_('Q&A forum feedback'), message) + msg = _('Thanks for the feedback!') + request.user.message_set.create(message=msg) + return HttpResponseRedirect(get_next_url(request)) + else: + form = FeedbackForm(initial={'next':get_next_url(request)}) + + data['form'] = form + return render_to_response('feedback.html', data, context_instance=RequestContext(request)) +feedback.CANCEL_MESSAGE=_('We look forward to hearing your feedback! Please, give it next time :)') + +def privacy(request): + return render_to_response('privacy.html', context_instance=RequestContext(request)) + +def unanswered(request): + return questions(request, unanswered=True) + +def questions(request, tagname=None, unanswered=False): + """ + List of Questions, Tagged questions, and Unanswered questions. + """ + # template file + # "questions.html" or maybe index.html in the future + template_file = "questions.html" + # get pagesize from session, if failed then get default value + pagesize = request.session.get("pagesize", 10) + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score" } + view_id, orderby = _get_and_remember_questions_sort_method(request,view_dic,'latest') + + # check if request is from tagged questions + qs = Question.objects.exclude(deleted=True) + + if tagname is not None: + qs = qs.filter(tags__name = unquote(tagname)) + + if unanswered: + qs = qs.exclude(answer_accepted=True) + + author_name = None + #user contributed questions & answers + if 'user' in request.GET: + try: + author_name = request.GET['user'] + u = User.objects.get(username=author_name) + qs = qs.filter(Q(author=u) | Q(answers__author=u)) + except User.DoesNotExist: + author_name = None + + if request.user.is_authenticated(): + uid_str = str(request.user.id) + qs = qs.extra( + select = SortedDict([ + ( + 'interesting_score', + 'SELECT COUNT(1) FROM forum_markedtag, question_tags ' + + 'WHERE forum_markedtag.user_id = %s ' + + 'AND forum_markedtag.tag_id = question_tags.tag_id ' + + 'AND forum_markedtag.reason = \'good\' ' + + 'AND question_tags.question_id = question.id' + ), + ]), + select_params = (uid_str,), + ) + if request.user.hide_ignored_questions: + ignored_tags = Tag.objects.filter(user_selections__reason='bad', + user_selections__user = request.user) + qs = qs.exclude(tags__in=ignored_tags) + else: + qs = qs.extra( + select = SortedDict([ + ( + 'ignored_score', + 'SELECT COUNT(1) FROM forum_markedtag, question_tags ' + + 'WHERE forum_markedtag.user_id = %s ' + + 'AND forum_markedtag.tag_id = question_tags.tag_id ' + + 'AND forum_markedtag.reason = \'bad\' ' + + 'AND question_tags.question_id = question.id' + ) + ]), + select_params = (uid_str, ) + ) + + qs = qs.select_related(depth=1).order_by(orderby) + + objects_list = Paginator(qs, pagesize) + questions = objects_list.page(page) + + # Get related tags from this page objects + if questions.object_list.count() > 0: + related_tags = Tag.objects.get_tags_by_questions(questions.object_list) + else: + related_tags = None + tags_autocomplete = _get_tags_cache_json() + + # get the list of interesting and ignored tags + (interesting_tag_names, ignored_tag_names) = (None, None) + if request.user.is_authenticated(): + pt = MarkedTag.objects.filter(user=request.user) + interesting_tag_names = pt.filter(reason='good').values_list('tag__name', flat=True) + ignored_tag_names = pt.filter(reason='bad').values_list('tag__name', flat=True) + + return render_to_response(template_file, { + "questions" : questions, + "author_name" : author_name, + "tab_id" : view_id, + "questions_count" : objects_list.count, + "tags" : related_tags, + "tags_autocomplete" : tags_autocomplete, + "searchtag" : tagname, + "is_unanswered" : unanswered, + "interesting_tag_names": interesting_tag_names, + 'ignored_tag_names': ignored_tag_names, + "context" : { + 'is_paginated' : True, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': questions.has_previous(), + 'has_next': questions.has_next(), + 'previous': questions.previous_page_number(), + 'next': questions.next_page_number(), + 'base_url' : request.path + '?sort=%s&' % view_id, + 'pagesize' : pagesize + }}, context_instance=RequestContext(request)) + +def create_new_answer( question=None, author=None,\ + added_at=None, wiki=False,\ + text='', email_notify=False): + + html = sanitize_html(markdowner.convert(text)) + + #create answer + answer = Answer( + question=question, + author=author, + added_at=added_at, + wiki=wiki, + html=html + ) + if answer.wiki: + answer.last_edited_by = answer.author + answer.last_edited_at = added_at + answer.wikified_at = added_at + + answer.save() + + #update question data + question.last_activity_at = added_at + question.last_activity_by = author + question.save() + Question.objects.update_answer_count(question) + + #update revision + AnswerRevision.objects.create( + answer=answer, + revision=1, + author=author, + revised_at=added_at, + summary=CONST['default_version'], + text=text + ) + + #set notification/delete + if email_notify: + if author not in question.followed_by.all(): + question.followed_by.add(author) + else: + #not sure if this is necessary. ajax should take care of this... + try: + question.followed_by.remove(author) + except: + pass + +def create_new_question(title=None, author=None, added_at=None, + wiki=False, tagnames=None, summary=None, + text=None): + """this is not a view + and maybe should become one of the methods on Question object? + """ + html = sanitize_html(markdowner.convert(text)) + question = Question( + title=title, + author=author, + added_at=added_at, + last_activity_at=added_at, + last_activity_by=author, + wiki=wiki, + tagnames=tagnames, + html=html, + summary=summary + ) + if question.wiki: + question.last_edited_by = question.author + question.last_edited_at = added_at + question.wikified_at = added_at + + question.save() + + # create the first revision + QuestionRevision.objects.create( + question=question, + revision=1, + title=question.title, + author=author, + revised_at=added_at, + tagnames=question.tagnames, + summary=CONST['default_version'], + text=text + ) + return question + +#TODO: allow anynomus user to ask question by providing email and username. +@login_required +def ask(request): + if request.method == "POST": + form = AskForm(request.POST) + if form.is_valid(): + + added_at = datetime.datetime.now() + title = strip_tags(form.cleaned_data['title'].strip()) + wiki = form.cleaned_data['wiki'] + tagnames = form.cleaned_data['tags'].strip() + text = form.cleaned_data['text'] + html = sanitize_html(markdowner.convert(text)) + summary = strip_tags(html)[:120] + + if request.user.is_authenticated(): + author = request.user + + question = create_new_question( + title=title, + author=author, + added_at=added_at, + wiki=wiki, + tagnames=tagnames, + summary=summary, + text=text + ) + return HttpResponseRedirect(question.get_absolute_url()) + else: + request.session.flush() + session_key = request.session.session_key + question = AnonymousQuestion( + session_key=session_key, + title=title, + tagnames=tagnames, + wiki=wiki, + text=text, + summary=summary, + added_at=added_at, + ip_addr=request.META['REMOTE_ADDR'], + ) + question.save() + return HttpResponseRedirect(reverse('user_signin_new_question')) + else: + form = AskForm() + + tags = _get_tags_cache_json() + return render_to_response('ask.html', { + 'form' : form, + 'tags' : tags, + 'email_validation_faq_url':reverse('faq') + '#validate', + }, context_instance=RequestContext(request)) + +def question(request, id): + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + view_id = request.GET.get('sort', None) + view_dic = {"latest":"-added_at", "oldest":"added_at", "votes":"-score" } + try: + orderby = view_dic[view_id] + except KeyError: + qsm = request.session.get('questions_sort_method',None) + if qsm in ('mostvoted','latest'): + logging.debug('loaded from session ' + qsm) + if qsm == 'mostvoted': + view_id = 'votes' + orderby = '-score' + else: + view_id = 'latest' + orderby = '-added_at' + else: + view_id = "votes" + orderby = "-score" + + logging.debug('view_id=' + str(view_id)) + + question = get_object_or_404(Question, id=id) + try: + pattern = r'/%s%s%d/([\w-]+)' % (settings.FORUM_SCRIPT_ALIAS,_('question/'), question.id) + path_re = re.compile(pattern) + logging.debug(pattern) + logging.debug(request.path) + m = path_re.match(request.path) + if m: + slug = m.group(1) + logging.debug('have slug %s' % slug) + assert(slug == slugify(question.title)) + else: + logging.debug('no match!') + except: + return HttpResponseRedirect(question.get_absolute_url()) + + if question.deleted and not can_view_deleted_post(request.user, question): + raise Http404 + answer_form = AnswerForm(question, request.user) + answers = Answer.objects.get_answers_from_question(question, request.user, orderby) + answers = answers.select_related(depth=1) + + favorited = question.has_favorite_by_user(request.user) + if request.user.is_authenticated(): + question_vote = question.votes.select_related().filter(user=request.user) + else: + question_vote = None #is this correct? + if question_vote is not None and question_vote.count() > 0: + question_vote = question_vote[0] + + user_answer_votes = {} + for vote in question.get_user_votes_in_answers(request.user): + if not user_answer_votes.has_key(vote.object_id): + vote_value = -1 + if vote.is_upvote(): + vote_value = 1 + user_answer_votes[answer.id] = vote_value + + if answers is not None: + answers = answers.order_by("-accepted", orderby) + + filtered_answers = [] + for answer in answers: + if answer.deleted == True: + if answer.author_id == request.user.id: + filtered_answers.append(answer) + else: + filtered_answers.append(answer) + + objects_list = Paginator(filtered_answers, ANSWERS_PAGE_SIZE) + page_objects = objects_list.page(page) + + #todo: merge view counts per user and per session + #1) view count per session + update_view_count = False + if 'question_view_times' not in request.session: + request.session['question_view_times'] = {} + + last_seen = request.session['question_view_times'].get(question.id,None) + updated_when, updated_who = question.get_last_update_info() + + if updated_who != request.user: + if last_seen: + if last_seen < updated_when: + update_view_count = True + else: + update_view_count = True + + request.session['question_view_times'][question.id] = datetime.datetime.now() + + if update_view_count: + question.view_count += 1 + question.save() + + #2) question view count per user + if request.user.is_authenticated(): + try: + question_view = QuestionView.objects.get(who=request.user, question=question) + except QuestionView.DoesNotExist: + question_view = QuestionView(who=request.user, question=question) + question_view.when = datetime.datetime.now() + question_view.save() + + return render_to_response('question.html', { + "question": question, + "question_vote": question_vote, + "question_comment_count":question.comments.count(), + "answer": answer_form, + "answers": page_objects.object_list, + "user_answer_votes": user_answer_votes, + "tags": question.tags.all(), + "tab_id": view_id, + "favorited": favorited, + "similar_questions": Question.objects.get_similar_questions(question), + "context": { + 'is_paginated': True, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': page_objects.has_previous(), + 'has_next': page_objects.has_next(), + 'previous': page_objects.previous_page_number(), + 'next': page_objects.next_page_number(), + 'base_url': request.path + '?sort=%s&' % view_id, + 'extend_url': "#sort-top" + } + }, context_instance=RequestContext(request)) + +@login_required +def close(request, id): + question = get_object_or_404(Question, id=id) + if not can_close_question(request.user, question): + return HttpResponse('Permission denied.') + if request.method == 'POST': + form = CloseForm(request.POST) + if form.is_valid(): + reason = form.cleaned_data['reason'] + question.closed = True + question.closed_by = request.user + question.closed_at = datetime.datetime.now() + question.close_reason = reason + question.save() + return HttpResponseRedirect(question.get_absolute_url()) + else: + form = CloseForm() + return render_to_response('close.html', { + 'form': form, + 'question': question, + }, context_instance=RequestContext(request)) + +@login_required +def reopen(request, id): + question = get_object_or_404(Question, id=id) + # open question + if not can_reopen_question(request.user, question): + return HttpResponse('Permission denied.') + if request.method == 'POST': + Question.objects.filter(id=question.id).update(closed=False, + closed_by=None, closed_at=None, close_reason=None) + return HttpResponseRedirect(question.get_absolute_url()) + else: + return render_to_response('reopen.html', { + 'question': question, + }, context_instance=RequestContext(request)) + +@login_required +def edit_question(request, id): + question = get_object_or_404(Question, id=id) + if question.deleted and not can_view_deleted_post(request.user, question): + raise Http404 + if can_edit_post(request.user, question): + return _edit_question(request, question) + elif can_retag_questions(request.user): + return _retag_question(request, question) + else: + raise Http404 + +def _retag_question(request, question): + if request.method == 'POST': + form = RetagQuestionForm(question, request.POST) + if form.is_valid(): + if form.has_changed(): + latest_revision = question.get_latest_revision() + retagged_at = datetime.datetime.now() + # Update the Question itself + Question.objects.filter(id=question.id).update( + tagnames=form.cleaned_data['tags'], + last_edited_at=retagged_at, + last_edited_by=request.user, + last_activity_at=retagged_at, + last_activity_by=request.user + ) + # Update the Question's tag associations + tags_updated = Question.objects.update_tags(question, + form.cleaned_data['tags'], request.user) + # Create a new revision + QuestionRevision.objects.create( + question=question, + title=latest_revision.title, + author=request.user, + revised_at=retagged_at, + tagnames=form.cleaned_data['tags'], + summary=CONST['retagged'], + text=latest_revision.text + ) + # send tags updated singal + tags_updated.send(sender=question.__class__, question=question) + + return HttpResponseRedirect(question.get_absolute_url()) + else: + form = RetagQuestionForm(question) + return render_to_response('question_retag.html', { + 'question': question, + 'form': form, + 'tags': _get_tags_cache_json(), + }, context_instance=RequestContext(request)) + +def _edit_question(request, question): + latest_revision = question.get_latest_revision() + revision_form = None + if request.method == 'POST': + if 'select_revision' in request.POST: + # user has changed revistion number + revision_form = RevisionForm(question, latest_revision, request.POST) + if revision_form.is_valid(): + # Replace with those from the selected revision + form = EditQuestionForm(question, + QuestionRevision.objects.get(question=question, + revision=revision_form.cleaned_data['revision'])) + else: + form = EditQuestionForm(question, latest_revision, request.POST) + else: + # Always check modifications against the latest revision + form = EditQuestionForm(question, latest_revision, request.POST) + if form.is_valid(): + html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) + if form.has_changed(): + edited_at = datetime.datetime.now() + tags_changed = (latest_revision.tagnames != + form.cleaned_data['tags']) + tags_updated = False + # Update the Question itself + updated_fields = { + 'title': form.cleaned_data['title'], + 'last_edited_at': edited_at, + 'last_edited_by': request.user, + 'last_activity_at': edited_at, + 'last_activity_by': request.user, + 'tagnames': form.cleaned_data['tags'], + 'summary': strip_tags(html)[:120], + 'html': html, + } + + # only save when it's checked + # because wiki doesn't allow to be edited if last version has been enabled already + # and we make sure this in forms. + if ('wiki' in form.cleaned_data and + form.cleaned_data['wiki']): + updated_fields['wiki'] = True + updated_fields['wikified_at'] = edited_at + + Question.objects.filter( + id=question.id).update(** updated_fields) + # Update the Question's tag associations + if tags_changed: + tags_updated = Question.objects.update_tags( + question, form.cleaned_data['tags'], request.user) + # Create a new revision + revision = QuestionRevision( + question=question, + title=form.cleaned_data['title'], + author=request.user, + revised_at=edited_at, + tagnames=form.cleaned_data['tags'], + text=form.cleaned_data['text'], + ) + if form.cleaned_data['summary']: + revision.summary = form.cleaned_data['summary'] + else: + revision.summary = 'No.%s Revision' % latest_revision.revision + revision.save() + + return HttpResponseRedirect(question.get_absolute_url()) + else: + + revision_form = RevisionForm(question, latest_revision) + form = EditQuestionForm(question, latest_revision) + return render_to_response('question_edit.html', { + 'question': question, + 'revision_form': revision_form, + 'form': form, + 'tags': _get_tags_cache_json() + }, context_instance=RequestContext(request)) + + +@login_required +def edit_answer(request, id): + answer = get_object_or_404(Answer, id=id) + if answer.deleted and not can_view_deleted_post(request.user, answer): + raise Http404 + elif not can_edit_post(request.user, answer): + raise Http404 + else: + latest_revision = answer.get_latest_revision() + if request.method == "POST": + if 'select_revision' in request.POST: + # user has changed revistion number + revision_form = RevisionForm(answer, latest_revision, request.POST) + if revision_form.is_valid(): + # Replace with those from the selected revision + form = EditAnswerForm(answer, + AnswerRevision.objects.get(answer=answer, + revision=revision_form.cleaned_data['revision'])) + else: + form = EditAnswerForm(answer, latest_revision, request.POST) + else: + form = EditAnswerForm(answer, latest_revision, request.POST) + if form.is_valid(): + html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) + if form.has_changed(): + edited_at = datetime.datetime.now() + updated_fields = { + 'last_edited_at': edited_at, + 'last_edited_by': request.user, + 'html': html, + } + Answer.objects.filter(id=answer.id).update(** updated_fields) + + revision = AnswerRevision( + answer=answer, + author=request.user, + revised_at=edited_at, + text=form.cleaned_data['text'] + ) + + if form.cleaned_data['summary']: + revision.summary = form.cleaned_data['summary'] + else: + revision.summary = 'No.%s Revision' % latest_revision.revision + revision.save() + + answer.question.last_activity_at = edited_at + answer.question.last_activity_by = request.user + answer.question.save() + + return HttpResponseRedirect(answer.get_absolute_url()) + else: + revision_form = RevisionForm(answer, latest_revision) + form = EditAnswerForm(answer, latest_revision) + return render_to_response('answer_edit.html', { + 'answer': answer, + 'revision_form': revision_form, + 'form': form, + }, context_instance=RequestContext(request)) + +QUESTION_REVISION_TEMPLATE = ('<h1>%(title)s</h1>\n' + '<div class="text">%(html)s</div>\n' + '<div class="tags">%(tags)s</div>') +def question_revisions(request, id): + post = get_object_or_404(Question, id=id) + revisions = list(post.revisions.all()) + revisions.reverse() + for i, revision in enumerate(revisions): + revision.html = QUESTION_REVISION_TEMPLATE % { + 'title': revision.title, + 'html': sanitize_html(markdowner.convert(revision.text)), + 'tags': ' '.join(['<a class="post-tag">%s</a>' % tag + for tag in revision.tagnames.split(' ')]), + } + if i > 0: + revisions[i].diff = htmldiff(revisions[i-1].html, revision.html) + else: + revisions[i].diff = QUESTION_REVISION_TEMPLATE % { + 'title': revisions[0].title, + 'html': sanitize_html(markdowner.convert(revisions[0].text)), + 'tags': ' '.join(['<a class="post-tag">%s</a>' % tag + for tag in revisions[0].tagnames.split(' ')]), + } + revisions[i].summary = _('initial version') + return render_to_response('revisions_question.html', { + 'post': post, + 'revisions': revisions, + }, context_instance=RequestContext(request)) + +ANSWER_REVISION_TEMPLATE = ('<div class="text">%(html)s</div>') +def answer_revisions(request, id): + post = get_object_or_404(Answer, id=id) + revisions = list(post.revisions.all()) + revisions.reverse() + for i, revision in enumerate(revisions): + revision.html = ANSWER_REVISION_TEMPLATE % { + 'html': sanitize_html(markdowner.convert(revision.text)) + } + if i > 0: + revisions[i].diff = htmldiff(revisions[i-1].html, revision.html) + else: + revisions[i].diff = revisions[i].text + revisions[i].summary = _('initial version') + return render_to_response('revisions_answer.html', { + 'post': post, + 'revisions': revisions, + }, context_instance=RequestContext(request)) + +@login_required +def answer(request, id): + question = get_object_or_404(Question, id=id) + if request.method == "POST": + form = AnswerForm(question, request.user, request.POST) + if form.is_valid(): + wiki = form.cleaned_data['wiki'] + text = form.cleaned_data['text'] + update_time = datetime.datetime.now() + + if request.user.is_authenticated(): + create_new_answer( + question=question, + author=request.user, + added_at=update_time, + wiki=wiki, + text=text, + email_notify=form.cleaned_data['email_notify'] + ) + else: + request.session.flush() + html = sanitize_html(markdowner.convert(text)) + summary = strip_tags(html)[:120] + anon = AnonymousAnswer( + question=question, + wiki=wiki, + text=text, + summary=summary, + session_key=request.session.session_key, + ip_addr=request.META['REMOTE_ADDR'], + ) + anon.save() + return HttpResponseRedirect(reverse('user_signin_new_answer')) + + return HttpResponseRedirect(question.get_absolute_url()) + +def tags(request): + stag = "" + is_paginated = True + sortby = request.GET.get('sort', 'used') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + if request.method == "GET": + stag = request.GET.get("q", "").strip() + if stag != '': + objects_list = Paginator(Tag.objects.filter(deleted=False).exclude(used_count=0).extra(where=['name like %s'], params=['%' + stag + '%']), DEFAULT_PAGE_SIZE) + else: + if sortby == "used": + sortby = "-used_count" + else: + sortby = "name" + objects_list = Paginator(Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by(sortby), DEFAULT_PAGE_SIZE) + try: + tags = objects_list.page(page) + except (EmptyPage, InvalidPage): + tags = objects_list.page(objects_list.num_pages) + + return render_to_response('tags.html', { + "tags" : tags, + "stag" : stag, + "tab_id" : sortby, + "keywords" : stag, + "context" : { + 'is_paginated' : is_paginated, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': tags.has_previous(), + 'has_next': tags.has_next(), + 'previous': tags.previous_page_number(), + 'next': tags.next_page_number(), + 'base_url' : reverse('tags') + '?sort=%s&' % sortby + } + }, context_instance=RequestContext(request)) + +def tag(request, tag): + return questions(request, tagname=tag) + +def vote(request, id): + """ + vote_type: + acceptAnswer : 0, + questionUpVote : 1, + questionDownVote : 2, + favorite : 4, + answerUpVote: 5, + answerDownVote:6, + offensiveQuestion : 7, + offensiveAnswer:8, + removeQuestion: 9, + removeAnswer:10 + questionSubscribeUpdates:11 + + accept answer code: + response_data['allowed'] = -1, Accept his own answer 0, no allowed - Anonymous 1, Allowed - by default + response_data['success'] = 0, failed 1, Success - by default + response_data['status'] = 0, By default 1, Answer has been accepted already(Cancel) + + vote code: + allowed = -3, Don't have enough votes left + -2, Don't have enough reputation score + -1, Vote his own post + 0, no allowed - Anonymous + 1, Allowed - by default + status = 0, By default + 1, Cancel + 2, Vote is too old to be canceled + + offensive code: + allowed = -3, Don't have enough flags left + -2, Don't have enough reputation score to do this + 0, not allowed + 1, allowed + status = 0, by default + 1, can't do it again + """ + response_data = { + "allowed": 1, + "success": 1, + "status": 0, + "count": 0, + "message": '' + } + + def can_vote(vote_score, user): + if vote_score == 1: + return can_vote_up(request.user) + else: + return can_vote_down(request.user) + + try: + if not request.user.is_authenticated(): + response_data['allowed'] = 0 + response_data['success'] = 0 + + elif request.is_ajax(): + question = get_object_or_404(Question, id=id) + vote_type = request.POST.get('type') + + #accept answer + if vote_type == '0': + answer_id = request.POST.get('postId') + answer = get_object_or_404(Answer, id=answer_id) + # make sure question author is current user + if question.author == request.user: + # answer user who is also question author is not allow to accept answer + if answer.author == question.author: + response_data['success'] = 0 + response_data['allowed'] = -1 + # check if answer has been accepted already + elif answer.accepted: + onAnswerAcceptCanceled(answer, request.user) + response_data['status'] = 1 + else: + # set other answers in this question not accepted first + for answer_of_question in Answer.objects.get_answers_from_question(question, request.user): + if answer_of_question != answer and answer_of_question.accepted: + onAnswerAcceptCanceled(answer_of_question, request.user) + + #make sure retrieve data again after above author changes, they may have related data + answer = get_object_or_404(Answer, id=answer_id) + onAnswerAccept(answer, request.user) + else: + response_data['allowed'] = 0 + response_data['success'] = 0 + # favorite + elif vote_type == '4': + has_favorited = False + fav_questions = FavoriteQuestion.objects.filter(question=question) + # if the same question has been favorited before, then delete it + if fav_questions is not None: + for item in fav_questions: + if item.user == request.user: + item.delete() + response_data['status'] = 1 + response_data['count'] = len(fav_questions) - 1 + if response_data['count'] < 0: + response_data['count'] = 0 + has_favorited = True + # if above deletion has not been executed, just insert a new favorite question + if not has_favorited: + new_item = FavoriteQuestion(question=question, user=request.user) + new_item.save() + response_data['count'] = FavoriteQuestion.objects.filter(question=question).count() + Question.objects.update_favorite_count(question) + + elif vote_type in ['1', '2', '5', '6']: + post_id = id + post = question + vote_score = 1 + if vote_type in ['5', '6']: + answer_id = request.POST.get('postId') + answer = get_object_or_404(Answer, id=answer_id) + post_id = answer_id + post = answer + if vote_type in ['2', '6']: + vote_score = -1 + + if post.author == request.user: + response_data['allowed'] = -1 + elif not can_vote(vote_score, request.user): + response_data['allowed'] = -2 + elif post.votes.filter(user=request.user).count() > 0: + vote = post.votes.filter(user=request.user)[0] + # unvote should be less than certain time + if (datetime.datetime.now().day - vote.voted_at.day) >= VOTE_RULES['scope_deny_unvote_days']: + response_data['status'] = 2 + else: + voted = vote.vote + if voted > 0: + # cancel upvote + onUpVotedCanceled(vote, post, request.user) + + else: + # cancel downvote + onDownVotedCanceled(vote, post, request.user) + + response_data['status'] = 1 + response_data['count'] = post.score + elif Vote.objects.get_votes_count_today_from_user(request.user) >= VOTE_RULES['scope_votes_per_user_per_day']: + response_data['allowed'] = -3 + else: + vote = Vote(user=request.user, content_object=post, vote=vote_score, voted_at=datetime.datetime.now()) + if vote_score > 0: + # upvote + onUpVoted(vote, post, request.user) + else: + # downvote + onDownVoted(vote, post, request.user) + + votes_left = VOTE_RULES['scope_votes_per_user_per_day'] - Vote.objects.get_votes_count_today_from_user(request.user) + if votes_left <= VOTE_RULES['scope_warn_votes_left']: + response_data['message'] = u'%s votes left' % votes_left + response_data['count'] = post.score + elif vote_type in ['7', '8']: + post = question + post_id = id + if vote_type == '8': + post_id = request.POST.get('postId') + post = get_object_or_404(Answer, id=post_id) + + if FlaggedItem.objects.get_flagged_items_count_today(request.user) >= VOTE_RULES['scope_flags_per_user_per_day']: + response_data['allowed'] = -3 + elif not can_flag_offensive(request.user): + response_data['allowed'] = -2 + elif post.flagged_items.filter(user=request.user).count() > 0: + response_data['status'] = 1 + else: + item = FlaggedItem(user=request.user, content_object=post, flagged_at=datetime.datetime.now()) + onFlaggedItem(item, post, request.user) + response_data['count'] = post.offensive_flag_count + # send signal when question or answer be marked offensive + mark_offensive.send(sender=post.__class__, instance=post, mark_by=request.user) + elif vote_type in ['9', '10']: + post = question + post_id = id + if vote_type == '10': + post_id = request.POST.get('postId') + post = get_object_or_404(Answer, id=post_id) + + if not can_delete_post(request.user, post): + response_data['allowed'] = -2 + elif post.deleted == True: + logging.debug('debug restoring post in view') + onDeleteCanceled(post, request.user) + response_data['status'] = 1 + else: + onDeleted(post, request.user) + delete_post_or_answer.send(sender=post.__class__, instance=post, delete_by=request.user) + elif vote_type == '11':#subscribe q updates + user = request.user + if user.is_authenticated(): + if user not in question.followed_by.all(): + question.followed_by.add(user) + if settings.EMAIL_VALIDATION == 'on' and user.email_isvalid == False: + response_data['message'] = \ + _('subscription saved, %(email)s needs validation, see %(details_url)s') \ + % {'email':user.email,'details_url':reverse('faq') + '#validate'} + feed_setting = EmailFeedSetting.objects.get(subscriber=user,feed_type='q_sel') + if feed_setting.frequency == 'n': + feed_setting.frequency = 'd' + feed_setting.save() + if 'message' in response_data: + response_data['message'] += '<br/>' + response_data['message'] = _('email update frequency has been set to daily') + #response_data['status'] = 1 + #responst_data['allowed'] = 1 + else: + pass + #response_data['status'] = 0 + #response_data['allowed'] = 0 + elif vote_type == '12':#unsubscribe q updates + user = request.user + if user.is_authenticated(): + if user in question.followed_by.all(): + question.followed_by.remove(user) + else: + response_data['success'] = 0 + response_data['message'] = u'Request mode is not supported. Please try again.' + + data = simplejson.dumps(response_data) + + except Exception, e: + response_data['message'] = str(e) + data = simplejson.dumps(response_data) + return HttpResponse(data, mimetype="application/json") + +@ajax_login_required +def mark_tag(request, tag=None, **kwargs): + action = kwargs['action'] + ts = MarkedTag.objects.filter(user=request.user, tag__name=tag) + if action == 'remove': + logging.debug('deleting tag %s' % tag) + ts.delete() + else: + reason = kwargs['reason'] + if len(ts) == 0: + try: + t = Tag.objects.get(name=tag) + mt = MarkedTag(user=request.user, reason=reason, tag=t) + mt.save() + except: + pass + else: + ts.update(reason=reason) + return HttpResponse(simplejson.dumps(''), mimetype="application/json") + +@ajax_login_required +def ajax_toggle_ignored_questions(request): + if request.user.hide_ignored_questions: + new_hide_setting = False + else: + new_hide_setting = True + request.user.hide_ignored_questions = new_hide_setting + request.user.save() + +@ajax_method +def ajax_command(request): + if 'command' not in request.POST: + return HttpResponseForbidden(mimetype="application/json") + if request.POST['command'] == 'toggle-ignored-questions': + return ajax_toggle_ignored_questions(request) + +def users(request): + is_paginated = True + sortby = request.GET.get('sort', 'reputation') + suser = request.REQUEST.get('q', "") + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + if suser == "": + if sortby == "newest": + objects_list = Paginator(User.objects.all().order_by('-date_joined'), USERS_PAGE_SIZE) + elif sortby == "last": + objects_list = Paginator(User.objects.all().order_by('date_joined'), USERS_PAGE_SIZE) + elif sortby == "user": + objects_list = Paginator(User.objects.all().order_by('username'), USERS_PAGE_SIZE) + # default + else: + objects_list = Paginator(User.objects.all().order_by('-reputation'), USERS_PAGE_SIZE) + base_url = reverse('users') + '?sort=%s&' % sortby + else: + sortby = "reputation" + objects_list = Paginator(User.objects.extra(where=['username like %s'], params=['%' + suser + '%']).order_by('-reputation'), USERS_PAGE_SIZE) + base_url = reverse('users') + '?name=%s&sort=%s&' % (suser, sortby) + + try: + users = objects_list.page(page) + except (EmptyPage, InvalidPage): + users = objects_list.page(objects_list.num_pages) + + return render_to_response('users.html', { + "users" : users, + "suser" : suser, + "keywords" : suser, + "tab_id" : sortby, + "context" : { + 'is_paginated' : is_paginated, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': users.has_previous(), + 'has_next': users.has_next(), + 'previous': users.previous_page_number(), + 'next': users.next_page_number(), + 'base_url' : base_url + } + + }, context_instance=RequestContext(request)) + +def user(request, id): + sort = request.GET.get('sort', 'stats') + user_view = dict((v.id, v) for v in USER_TEMPLATE_VIEWS).get(sort, USER_TEMPLATE_VIEWS[0]) + from forum import views + func = getattr(views, user_view.view_name) + return func(request, id, user_view) + +@login_required +def moderate_user(request, id): + """ajax handler of user moderation + """ + if not auth.can_moderate_users(request.user) or request.method != 'POST': + raise Http404 + if not request.is_ajax(): + return HttpResponseForbidden(mimetype="application/json") + + user = get_object_or_404(User, id=id) + form = ModerateUserForm(request.POST, instance=user) + + if form.is_valid(): + form.save() + logging.debug('data saved') + response = HttpResponse(simplejson.dumps(''), mimetype="application/json") + else: + response = HttpResponseForbidden(mimetype="application/json") + return response + +@login_required +def edit_user(request, id): + user = get_object_or_404(User, id=id) + if request.user != user: + raise Http404 + if request.method == "POST": + form = EditUserForm(user, request.POST) + if form.is_valid(): + new_email = sanitize_html(form.cleaned_data['email']) + + from django_authopenid.views import set_new_email + set_new_email(user, new_email) + + #user.username = sanitize_html(form.cleaned_data['username']) + user.real_name = sanitize_html(form.cleaned_data['realname']) + user.website = sanitize_html(form.cleaned_data['website']) + user.location = sanitize_html(form.cleaned_data['city']) + user.date_of_birth = sanitize_html(form.cleaned_data['birthday']) + if len(user.date_of_birth) == 0: + user.date_of_birth = '1900-01-01' + user.about = sanitize_html(form.cleaned_data['about']) + + user.save() + # send user updated singal if full fields have been updated + if user.email and user.real_name and user.website and user.location and \ + user.date_of_birth and user.about: + user_updated.send(sender=user.__class__, instance=user, updated_by=user) + return HttpResponseRedirect(user.get_profile_url()) + else: + form = EditUserForm(user) + return render_to_response('user_edit.html', { + 'form' : form, + 'gravatar_faq_url' : reverse('faq') + '#gravatar', + }, context_instance=RequestContext(request)) + +def user_stats(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + questions = Question.objects.extra( + select={ + 'vote_count' : 'question.score', + 'favorited_myself' : 'SELECT count(*) FROM favorite_question f WHERE f.user_id = %s AND f.question_id = question.id', + 'la_user_id' : 'auth_user.id', + 'la_username' : 'auth_user.username', + 'la_user_gold' : 'auth_user.gold', + 'la_user_silver' : 'auth_user.silver', + 'la_user_bronze' : 'auth_user.bronze', + 'la_user_reputation' : 'auth_user.reputation' + }, + select_params=[user_id], + tables=['question', 'auth_user'], + where=['question.deleted=False AND question.author_id=%s AND question.last_activity_by_id = auth_user.id'], + params=[user_id], + order_by=['-vote_count', '-last_activity_at'] + ).values('vote_count', + 'favorited_myself', + 'id', + 'title', + 'author_id', + 'added_at', + 'answer_accepted', + 'answer_count', + 'comment_count', + 'view_count', + 'favourite_count', + 'summary', + 'tagnames', + 'vote_up_count', + 'vote_down_count', + 'last_activity_at', + 'la_user_id', + 'la_username', + 'la_user_gold', + 'la_user_silver', + 'la_user_bronze', + 'la_user_reputation')[:100] + + answered_questions = Question.objects.extra( + select={ + 'vote_up_count' : 'answer.vote_up_count', + 'vote_down_count' : 'answer.vote_down_count', + 'answer_id' : 'answer.id', + 'accepted' : 'answer.accepted', + 'vote_count' : 'answer.score', + 'comment_count' : 'answer.comment_count' + }, + tables=['question', 'answer'], + where=['answer.deleted=False AND question.deleted=False AND answer.author_id=%s AND answer.question_id=question.id'], + params=[user_id], + order_by=['-vote_count', '-answer_id'], + select_params=[user_id] + ).distinct().values('comment_count', + 'id', + 'answer_id', + 'title', + 'author_id', + 'accepted', + 'vote_count', + 'answer_count', + 'vote_up_count', + 'vote_down_count')[:100] + + up_votes = Vote.objects.get_up_vote_count_from_user(user) + down_votes = Vote.objects.get_down_vote_count_from_user(user) + votes_today = Vote.objects.get_votes_count_today_from_user(user) + votes_total = VOTE_RULES['scope_votes_per_user_per_day'] + + question_id_set = set(map(lambda v: v['id'], list(questions))) \ + | set(map(lambda v: v['id'], list(answered_questions))) + + user_tags = Tag.objects.filter(questions__id__in = question_id_set) + try: + from django.db.models import Count + awards = Award.objects.extra( + select={'id': 'badge.id', + 'name':'badge.name', + 'description': 'badge.description', + 'type': 'badge.type'}, + tables=['award', 'badge'], + order_by=['-awarded_at'], + where=['user_id=%s AND badge_id=badge.id'], + params=[user.id] + ).values('id', 'name', 'description', 'type') + total_awards = awards.count() + awards = awards.annotate(count = Count('badge__id')) + user_tags = user_tags.annotate(user_tag_usage_count=Count('name')) + + except ImportError: + awards = Award.objects.extra( + select={'id': 'badge.id', + 'count': 'count(badge_id)', + 'name':'badge.name', + 'description': 'badge.description', + 'type': 'badge.type'}, + tables=['award', 'badge'], + order_by=['-awarded_at'], + where=['user_id=%s AND badge_id=badge.id'], + params=[user.id] + ).values('id', 'count', 'name', 'description', 'type') + total_awards = awards.count() + awards.query.group_by = ['badge_id'] + + user_tags = user_tags.extra( + select={'user_tag_usage_count': 'COUNT(1)',}, + order_by=['-user_tag_usage_count'], + ) + user_tags.query.group_by = ['name'] + + if auth.can_moderate_users(request.user): + moderate_user_form = ModerateUserForm(instance=user) + else: + moderate_user_form = None + + return render_to_response(user_view.template_file,{ + 'moderate_user_form': moderate_user_form, + "tab_name" : user_view.id, + "tab_description" : user_view.tab_description, + "page_title" : user_view.page_title, + "view_user" : user, + "questions" : questions, + "answered_questions" : answered_questions, + "up_votes" : up_votes, + "down_votes" : down_votes, + "total_votes": up_votes + down_votes, + "votes_today_left": votes_total-votes_today, + "votes_total_per_day": votes_total, + "user_tags" : user_tags[:50], + "tags" : tags, + "awards": awards, + "total_awards" : total_awards, + }, context_instance=RequestContext(request)) + +def user_recent(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + def get_type_name(type_id): + for item in TYPE_ACTIVITY: + if type_id in item: + return item[1] + + class Event: + def __init__(self, time, type, title, summary, answer_id, question_id): + self.time = time + self.type = get_type_name(type) + self.type_id = type + self.title = title + self.summary = summary + slug_title = slugify(title) + self.title_link = reverse('question', kwargs={'id':question_id}) + u'%s' % slug_title + if int(answer_id) > 0: + self.title_link += '#%s' % answer_id + + class AwardEvent: + def __init__(self, time, type, id): + self.time = time + self.type = get_type_name(type) + self.type_id = type + self.badge = get_object_or_404(Badge, id=id) + + activities = [] + # ask questions + questions = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'active_at' : 'activity.active_at', + 'activity_type' : 'activity.activity_type' + }, + tables=['activity', 'question'], + where=['activity.content_type_id = %s AND activity.object_id = ' + + 'question.id AND question.deleted=False AND activity.user_id = %s AND activity.activity_type = %s'], + params=[question_type_id, user_id, TYPE_ACTIVITY_ASK_QUESTION], + order_by=['-activity.active_at'] + ).values( + 'title', + 'question_id', + 'active_at', + 'activity_type' + ) + if len(questions) > 0: + questions = [(Event(q['active_at'], q['activity_type'], q['title'], '', '0', \ + q['question_id'])) for q in questions] + activities.extend(questions) + + # answers + answers = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'active_at' : 'activity.active_at', + 'activity_type' : 'activity.activity_type' + }, + tables=['activity', 'answer', 'question'], + where=['activity.content_type_id = %s AND activity.object_id = answer.id AND ' + + 'answer.question_id=question.id AND answer.deleted=False AND activity.user_id=%s AND '+ + 'activity.activity_type=%s AND question.deleted=False'], + params=[answer_type_id, user_id, TYPE_ACTIVITY_ANSWER], + order_by=['-activity.active_at'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'active_at', + 'activity_type' + ) + if len(answers) > 0: + answers = [(Event(q['active_at'], q['activity_type'], q['title'], '', q['answer_id'], \ + q['question_id'])) for q in answers] + activities.extend(answers) + + # question comments + comments = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'comment.object_id', + 'added_at' : 'comment.added_at', + 'activity_type' : 'activity.activity_type' + }, + tables=['activity', 'question', 'comment'], + + where=['activity.content_type_id = %s AND activity.object_id = comment.id AND '+ + 'activity.user_id = comment.user_id AND comment.object_id=question.id AND '+ + 'comment.content_type_id=%s AND activity.user_id = %s AND activity.activity_type=%s AND ' + + 'question.deleted=False'], + params=[comment_type_id, question_type_id, user_id, TYPE_ACTIVITY_COMMENT_QUESTION], + order_by=['-comment.added_at'] + ).values( + 'title', + 'question_id', + 'added_at', + 'activity_type' + ) + + if len(comments) > 0: + comments = [(Event(q['added_at'], q['activity_type'], q['title'], '', '0', \ + q['question_id'])) for q in comments] + activities.extend(comments) + + # answer comments + comments = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'added_at' : 'comment.added_at', + 'activity_type' : 'activity.activity_type' + }, + tables=['activity', 'question', 'answer', 'comment'], + + where=['activity.content_type_id = %s AND activity.object_id = comment.id AND '+ + 'activity.user_id = comment.user_id AND comment.object_id=answer.id AND '+ + 'comment.content_type_id=%s AND question.id = answer.question_id AND '+ + 'activity.user_id = %s AND activity.activity_type=%s AND '+ + 'answer.deleted=False AND question.deleted=False'], + params=[comment_type_id, answer_type_id, user_id, TYPE_ACTIVITY_COMMENT_ANSWER], + order_by=['-comment.added_at'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'added_at', + 'activity_type' + ) + + if len(comments) > 0: + comments = [(Event(q['added_at'], q['activity_type'], q['title'], '', q['answer_id'], \ + q['question_id'])) for q in comments] + activities.extend(comments) + + # question revisions + revisions = Activity.objects.extra( + select={ + 'title' : 'question_revision.title', + 'question_id' : 'question_revision.question_id', + 'added_at' : 'activity.active_at', + 'activity_type' : 'activity.activity_type', + 'summary' : 'question_revision.summary' + }, + tables=['activity', 'question_revision', 'question'], + where=['activity.content_type_id = %s AND activity.object_id = question_revision.id AND '+ + 'question_revision.id=question.id AND question.deleted=False AND '+ + 'activity.user_id = question_revision.author_id AND activity.user_id = %s AND '+ + 'activity.activity_type=%s'], + params=[question_revision_type_id, user_id, TYPE_ACTIVITY_UPDATE_QUESTION], + order_by=['-activity.active_at'] + ).values( + 'title', + 'question_id', + 'added_at', + 'activity_type', + 'summary' + ) + + if len(revisions) > 0: + revisions = [(Event(q['added_at'], q['activity_type'], q['title'], q['summary'], '0', \ + q['question_id'])) for q in revisions] + activities.extend(revisions) + + # answer revisions + revisions = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'added_at' : 'activity.active_at', + 'activity_type' : 'activity.activity_type', + 'summary' : 'answer_revision.summary' + }, + tables=['activity', 'answer_revision', 'question', 'answer'], + + where=['activity.content_type_id = %s AND activity.object_id = answer_revision.id AND '+ + 'activity.user_id = answer_revision.author_id AND activity.user_id = %s AND '+ + 'answer_revision.answer_id=answer.id AND answer.question_id = question.id AND '+ + 'question.deleted=False AND answer.deleted=False AND '+ + 'activity.activity_type=%s'], + params=[answer_revision_type_id, user_id, TYPE_ACTIVITY_UPDATE_ANSWER], + order_by=['-activity.active_at'] + ).values( + 'title', + 'question_id', + 'added_at', + 'answer_id', + 'activity_type', + 'summary' + ) + + if len(revisions) > 0: + revisions = [(Event(q['added_at'], q['activity_type'], q['title'], q['summary'], \ + q['answer_id'], q['question_id'])) for q in revisions] + activities.extend(revisions) + + # accepted answers + accept_answers = Activity.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'added_at' : 'activity.active_at', + 'activity_type' : 'activity.activity_type', + }, + tables=['activity', 'answer', 'question'], + where=['activity.content_type_id = %s AND activity.object_id = answer.id AND '+ + 'activity.user_id = question.author_id AND activity.user_id = %s AND '+ + 'answer.deleted=False AND question.deleted=False AND '+ + 'answer.question_id=question.id AND activity.activity_type=%s'], + params=[answer_type_id, user_id, TYPE_ACTIVITY_MARK_ANSWER], + order_by=['-activity.active_at'] + ).values( + 'title', + 'question_id', + 'added_at', + 'activity_type', + ) + if len(accept_answers) > 0: + accept_answers = [(Event(q['added_at'], q['activity_type'], q['title'], '', '0', \ + q['question_id'])) for q in accept_answers] + activities.extend(accept_answers) + #award history + awards = Activity.objects.extra( + select={ + 'badge_id': 'badge.id', + 'awarded_at': 'award.awarded_at', + 'activity_type': 'activity.activity_type' + }, + tables=['activity', 'award', 'badge'], + where=['activity.user_id = award.user_id AND activity.user_id = %s AND ' + + 'award.badge_id=badge.id AND activity.object_id=award.id AND activity.activity_type=%s'], + params=[user_id, TYPE_ACTIVITY_PRIZE], + order_by=['-activity.active_at'] + ).values( + 'badge_id', + 'awarded_at', + 'activity_type' + ) + if len(awards) > 0: + awards = [(AwardEvent(q['awarded_at'], q['activity_type'], q['badge_id'])) for q in awards] + activities.extend(awards) + + activities.sort(lambda x, y: cmp(y.time, x.time)) + + return render_to_response(user_view.template_file,{ + "tab_name" : user_view.id, + "tab_description" : user_view.tab_description, + "page_title" : user_view.page_title, + "view_user" : user, + "activities" : activities[:user_view.data_size] + }, context_instance=RequestContext(request)) + +def user_responses(request, user_id, user_view): + """ + We list answers for question, comments, and answer accepted by others for this user. + """ + class Response: + def __init__(self, type, title, question_id, answer_id, time, username, user_id, content): + self.type = type + self.title = title + self.titlelink = reverse('question', args=[question_id]) + u'%s#%s' % (slugify(title), answer_id) + self.time = time + self.userlink = reverse('users') + u'%s/%s/' % (user_id, username) + self.username = username + self.content = u'%s ...' % strip_tags(content)[:300] + + def __unicode__(self): + return u'%s %s' % (self.type, self.titlelink) + + user = get_object_or_404(User, id=user_id) + responses = [] + answers = Answer.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'added_at' : 'answer.added_at', + 'html' : 'answer.html', + 'username' : 'auth_user.username', + 'user_id' : 'auth_user.id' + }, + select_params=[user_id], + tables=['answer', 'question', 'auth_user'], + where=['answer.question_id = question.id AND answer.deleted=False AND question.deleted=False AND '+ + 'question.author_id = %s AND answer.author_id <> %s AND answer.author_id=auth_user.id'], + params=[user_id, user_id], + order_by=['-answer.id'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'added_at', + 'html', + 'username', + 'user_id' + ) + + if len(answers) > 0: + answers = [(Response(TYPE_RESPONSE['QUESTION_ANSWERED'], a['title'], a['question_id'], + a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers] + responses.extend(answers) + + + # question comments + comments = Comment.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'comment.object_id', + 'added_at' : 'comment.added_at', + 'comment' : 'comment.comment', + 'username' : 'auth_user.username', + 'user_id' : 'auth_user.id' + }, + tables=['question', 'auth_user', 'comment'], + where=['question.deleted=False AND question.author_id = %s AND comment.object_id=question.id AND '+ + 'comment.content_type_id=%s AND comment.user_id <> %s AND comment.user_id = auth_user.id'], + params=[user_id, question_type_id, user_id], + order_by=['-comment.added_at'] + ).values( + 'title', + 'question_id', + 'added_at', + 'comment', + 'username', + 'user_id' + ) + + if len(comments) > 0: + comments = [(Response(TYPE_RESPONSE['QUESTION_COMMENTED'], c['title'], c['question_id'], + '', c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments] + responses.extend(comments) + + # answer comments + comments = Comment.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'added_at' : 'comment.added_at', + 'comment' : 'comment.comment', + 'username' : 'auth_user.username', + 'user_id' : 'auth_user.id' + }, + tables=['answer', 'auth_user', 'comment', 'question'], + where=['answer.deleted=False AND answer.author_id = %s AND comment.object_id=answer.id AND '+ + 'comment.content_type_id=%s AND comment.user_id <> %s AND comment.user_id = auth_user.id '+ + 'AND question.id = answer.question_id'], + params=[user_id, answer_type_id, user_id], + order_by=['-comment.added_at'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'added_at', + 'comment', + 'username', + 'user_id' + ) + + if len(comments) > 0: + comments = [(Response(TYPE_RESPONSE['ANSWER_COMMENTED'], c['title'], c['question_id'], + c['answer_id'], c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments] + responses.extend(comments) + + # answer has been accepted + answers = Answer.objects.extra( + select={ + 'title' : 'question.title', + 'question_id' : 'question.id', + 'answer_id' : 'answer.id', + 'added_at' : 'answer.accepted_at', + 'html' : 'answer.html', + 'username' : 'auth_user.username', + 'user_id' : 'auth_user.id' + }, + select_params=[user_id], + tables=['answer', 'question', 'auth_user'], + where=['answer.question_id = question.id AND answer.deleted=False AND question.deleted=False AND '+ + 'answer.author_id = %s AND answer.accepted=True AND question.author_id=auth_user.id'], + params=[user_id], + order_by=['-answer.id'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'added_at', + 'html', + 'username', + 'user_id' + ) + if len(answers) > 0: + answers = [(Response(TYPE_RESPONSE['ANSWER_ACCEPTED'], a['title'], a['question_id'], + a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers] + responses.extend(answers) + + # sort posts by time + responses.sort(lambda x, y: cmp(y.time, x.time)) + + return render_to_response(user_view.template_file, { + "tab_name": user_view.id, + "tab_description": user_view.tab_description, + "page_title": user_view.page_title, + "view_user": user, + "responses": responses[:user_view.data_size], + + }, context_instance=RequestContext(request)) + +def user_votes(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + if not can_view_user_votes(request.user, user): + raise Http404 + votes = [] + question_votes = Vote.objects.extra( + select={ + 'title': 'question.title', + 'question_id': 'question.id', + 'answer_id': 0, + 'voted_at': 'vote.voted_at', + 'vote': 'vote', + }, + select_params=[user_id], + tables=['vote', 'question', 'auth_user'], + where=['vote.content_type_id = %s AND vote.user_id = %s AND vote.object_id = question.id ' + + 'AND vote.user_id=auth_user.id'], + params=[question_type_id, user_id], + order_by=['-vote.id'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'voted_at', + 'vote', + ) + if(len(question_votes) > 0): + votes.extend(question_votes) + + answer_votes = Vote.objects.extra( + select={ + 'title': 'question.title', + 'question_id': 'question.id', + 'answer_id': 'answer.id', + 'voted_at': 'vote.voted_at', + 'vote': 'vote', + }, + select_params=[user_id], + tables=['vote', 'answer', 'question', 'auth_user'], + where=['vote.content_type_id = %s AND vote.user_id = %s AND vote.object_id = answer.id ' + + 'AND answer.question_id = question.id AND vote.user_id=auth_user.id'], + params=[answer_type_id, user_id], + order_by=['-vote.id'] + ).values( + 'title', + 'question_id', + 'answer_id', + 'voted_at', + 'vote', + ) + if(len(answer_votes) > 0): + votes.extend(answer_votes) + votes.sort(lambda x, y: cmp(y['voted_at'], x['voted_at'])) + return render_to_response(user_view.template_file, { + "tab_name": user_view.id, + "tab_description": user_view.tab_description, + "page_title": user_view.page_title, + "view_user": user, + "votes": votes[:user_view.data_size] + + }, context_instance=RequestContext(request)) + +def user_reputation(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + try: + from django.db.models import Sum + reputation = Repute.objects.extra( + select={'question_id':'question_id', + 'title': 'question.title'}, + tables=['repute', 'question'], + order_by=['-reputed_at'], + where=['user_id=%s AND question_id=question.id'], + params=[user.id] + ).values('question_id', 'title', 'reputed_at', 'reputation') + reputation = reputation.annotate(positive=Sum("positive"), negative=Sum("negative")) + except ImportError: + reputation = Repute.objects.extra( + select={'positive':'sum(positive)', 'negative':'sum(negative)', 'question_id':'question_id', + 'title': 'question.title'}, + tables=['repute', 'question'], + order_by=['-reputed_at'], + where=['user_id=%s AND question_id=question.id'], + params=[user.id] + ).values('positive', 'negative', 'question_id', 'title', 'reputed_at', 'reputation') + reputation.query.group_by = ['question_id'] + + rep_list = [] + for rep in Repute.objects.filter(user=user).order_by('reputed_at'): + dic = '[%s,%s]' % (calendar.timegm(rep.reputed_at.timetuple()) * 1000, rep.reputation) + rep_list.append(dic) + reps = ','.join(rep_list) + reps = '[%s]' % reps + + return render_to_response(user_view.template_file, { + "tab_name": user_view.id, + "tab_description": user_view.tab_description, + "page_title": user_view.page_title, + "view_user": user, + "reputation": reputation, + "reps": reps + }, context_instance=RequestContext(request)) + +def user_favorites(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + questions = Question.objects.extra( + select={ + 'vote_count' : 'question.vote_up_count + question.vote_down_count', + 'favorited_myself' : 'SELECT count(*) FROM favorite_question f WHERE f.user_id = %s '+ + 'AND f.question_id = question.id', + 'la_user_id' : 'auth_user.id', + 'la_username' : 'auth_user.username', + 'la_user_gold' : 'auth_user.gold', + 'la_user_silver' : 'auth_user.silver', + 'la_user_bronze' : 'auth_user.bronze', + 'la_user_reputation' : 'auth_user.reputation' + }, + select_params=[user_id], + tables=['question', 'auth_user', 'favorite_question'], + where=['question.deleted=True AND question.last_activity_by_id = auth_user.id '+ + 'AND favorite_question.question_id = question.id AND favorite_question.user_id = %s'], + params=[user_id], + order_by=['-vote_count', '-question.id'] + ).values('vote_count', + 'favorited_myself', + 'id', + 'title', + 'author_id', + 'added_at', + 'answer_accepted', + 'answer_count', + 'comment_count', + 'view_count', + 'favourite_count', + 'summary', + 'tagnames', + 'vote_up_count', + 'vote_down_count', + 'last_activity_at', + 'la_user_id', + 'la_username', + 'la_user_gold', + 'la_user_silver', + 'la_user_bronze', + 'la_user_reputation') + return render_to_response(user_view.template_file,{ + "tab_name" : user_view.id, + "tab_description" : user_view.tab_description, + "page_title" : user_view.page_title, + "questions" : questions[:user_view.data_size], + "view_user" : user + }, context_instance=RequestContext(request)) + +def user_email_subscriptions(request, user_id, user_view): + user = get_object_or_404(User, id=user_id) + if request.method == 'POST': + email_feeds_form = EditUserEmailFeedsForm(request.POST) + tag_filter_form = TagFilterSelectionForm(request.POST, instance=user) + if email_feeds_form.is_valid() and tag_filter_form.is_valid(): + + action_status = None + tag_filter_saved = tag_filter_form.save() + if tag_filter_saved: + action_status = _('changes saved') + if 'save' in request.POST: + feeds_saved = email_feeds_form.save(user) + if feeds_saved: + action_status = _('changes saved') + elif 'stop_email' in request.POST: + email_stopped = email_feeds_form.reset().save(user) + initial_values = EditUserEmailFeedsForm.NO_EMAIL_INITIAL + email_feeds_form = EditUserEmailFeedsForm(initial=initial_values) + if email_stopped: + action_status = _('email updates canceled') + else: + email_feeds_form = EditUserEmailFeedsForm() + email_feeds_form.set_initial_values(user) + tag_filter_form = TagFilterSelectionForm(instance=user) + action_status = None + return render_to_response(user_view.template_file,{ + 'tab_name':user_view.id, + 'tab_description':user_view.tab_description, + 'page_title':user_view.page_title, + 'view_user':user, + 'email_feeds_form':email_feeds_form, + 'tag_filter_selection_form':tag_filter_form, + 'action_status':action_status, + }, context_instance=RequestContext(request)) + +def question_comments(request, id): + question = get_object_or_404(Question, id=id) + user = request.user + return __comments(request, question, 'question') + +def answer_comments(request, id): + answer = get_object_or_404(Answer, id=id) + user = request.user + return __comments(request, answer, 'answer') + +def __comments(request, obj, type): + # only support get comments by ajax now + user = request.user + if request.is_ajax(): + if request.method == "GET": + response = __generate_comments_json(obj, type, user) + elif request.method == "POST": + if auth.can_add_comments(user,obj): + comment_data = request.POST.get('comment') + comment = Comment(content_object=obj, comment=comment_data, user=request.user) + comment.save() + obj.comment_count = obj.comment_count + 1 + obj.save() + response = __generate_comments_json(obj, type, user) + else: + response = HttpResponseForbidden(mimetype="application/json") + return response + +def __generate_comments_json(obj, type, user): + comments = obj.comments.all().order_by('id') + # {"Id":6,"PostId":38589,"CreationDate":"an hour ago","Text":"hello there!","UserDisplayName":"Jarrod Dixon","UserUrl":"/users/3/jarrod-dixon","DeleteUrl":null} + json_comments = [] + from forum.templatetags.extra_tags import diff_date + for comment in comments: + comment_user = comment.user + delete_url = "" + if user != None and auth.can_delete_comment(user, comment): + #/posts/392845/comments/219852/delete + #todo translate this url + delete_url = reverse(index) + type + "s/%s/comments/%s/delete/" % (obj.id, comment.id) + json_comments.append({"id" : comment.id, + "object_id" : obj.id, + "comment_age" : diff_date(comment.added_at), + "text" : comment.comment, + "user_display_name" : comment_user.username, + "user_url" : comment_user.get_profile_url(), + "delete_url" : delete_url + }) + + data = simplejson.dumps(json_comments) + return HttpResponse(data, mimetype="application/json") + +def delete_comment(request, object_id='', comment_id='', commented_object_type=None): + response = None + commented_object = None + if commented_object_type == 'question': + commented_object = Question + elif commented_object_type == 'answer': + commented_object = Answer + + if request.is_ajax(): + comment = get_object_or_404(Comment, id=comment_id) + if auth.can_delete_comment(request.user, comment): + obj = get_object_or_404(commented_object, id=object_id) + obj.comments.remove(comment) + obj.comment_count = obj.comment_count - 1 + obj.save() + user = request.user + return __generate_comments_json(obj, commented_object_type, user) + raise PermissionDenied() + +def logout(request): + return render_to_response('logout.html', { + 'next' : get_next_url(request), + }, context_instance=RequestContext(request)) + +def badges(request): + badges = Badge.objects.all().order_by('type') + my_badges = [] + if request.user.is_authenticated(): + my_badges = Award.objects.filter(user=request.user) + my_badges.query.group_by = ['badge_id'] + + return render_to_response('badges.html', { + 'badges' : badges, + 'mybadges' : my_badges, + 'feedback_faq_url' : reverse('feedback'), + }, context_instance=RequestContext(request)) + +def badge(request, id): + badge = get_object_or_404(Badge, id=id) + awards = Award.objects.extra( + select={'id': 'auth_user.id', + 'name': 'auth_user.username', + 'rep':'auth_user.reputation', + 'gold': 'auth_user.gold', + 'silver': 'auth_user.silver', + 'bronze': 'auth_user.bronze'}, + tables=['award', 'auth_user'], + where=['badge_id=%s AND user_id=auth_user.id'], + params=[id] + ).distinct('id') + + return render_to_response('badge.html', { + 'awards': awards, + 'badge': badge, + }, context_instance=RequestContext(request)) + +def read_message(request): + if request.method == "POST": + if request.POST['formdata'] == 'required': + request.session['message_silent'] = 1 + if request.user.is_authenticated(): + request.user.delete_messages() + return HttpResponse('') + +def upload(request): + class FileTypeNotAllow(Exception): + pass + class FileSizeNotAllow(Exception): + pass + class UploadPermissionNotAuthorized(Exception): + pass + + #<result><msg><![CDATA[%s]]></msg><error><![CDATA[%s]]></error><file_url>%s</file_url></result> + xml_template = "<result><msg><![CDATA[%s]]></msg><error><![CDATA[%s]]></error><file_url>%s</file_url></result>" + + try: + f = request.FILES['file-upload'] + # check upload permission + if not can_upload_files(request.user): + raise UploadPermissionNotAuthorized + + # check file type + file_name_suffix = os.path.splitext(f.name)[1].lower() + if not file_name_suffix in settings.ALLOW_FILE_TYPES: + raise FileTypeNotAllow + + # generate new file name + new_file_name = str(time.time()).replace('.', str(random.randint(0,100000))) + file_name_suffix + # use default storage to store file + default_storage.save(new_file_name, f) + # check file size + # byte + size = default_storage.size(new_file_name) + if size > settings.ALLOW_MAX_FILE_SIZE: + default_storage.delete(new_file_name) + raise FileSizeNotAllow + + result = xml_template % ('Good', '', default_storage.url(new_file_name)) + except UploadPermissionNotAuthorized: + result = xml_template % ('', _('uploading images is limited to users with >60 reputation points'), '') + except FileTypeNotAllow: + result = xml_template % ('', _("allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'"), '') + except FileSizeNotAllow: + result = xml_template % ('', _("maximum upload file size is %sK") % settings.ALLOW_MAX_FILE_SIZE / 1024, '') + except Exception: + result = xml_template % ('', _('Error uploading file. Please contact the site administrator. Thank you. %s' % Exception), '') + + return HttpResponse(result, mimetype="application/xml") + +def books(request): + return HttpResponseRedirect(reverse('books') + '/mysql-zhaoyang') + +def book(request, short_name, unanswered=False): + """ + 1. questions list + 2. book info + 3. author info and blog rss items + """ + """ + List of Questions, Tagged questions, and Unanswered questions. + """ + books = Book.objects.extra(where=['short_name = %s'], params=[short_name]) + match_count = len(books) + if match_count == 0: + raise Http404 + else: + # the book info + book = books[0] + # get author info + author_info = BookAuthorInfo.objects.get(book=book) + # get author rss info + author_rss = BookAuthorRss.objects.filter(book=book) + + # get pagesize from session, if failed then get default value + user_page_size = request.session.get("pagesize", QUESTIONS_PAGE_SIZE) + # set pagesize equal to logon user specified value in database + if request.user.is_authenticated() and request.user.questions_per_page > 0: + user_page_size = request.user.questions_per_page + + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + view_id = request.GET.get('sort', None) + view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score"} + try: + orderby = view_dic[view_id] + except KeyError: + view_id = "latest" + orderby = "-added_at" + + # check if request is from tagged questions + if unanswered: + # check if request is from unanswered questions + # Article.objects.filter(publications__id__exact=1) + objects = Question.objects.filter(book__id__exact=book.id, deleted=False, answer_count=0).order_by(orderby) + else: + objects = Question.objects.filter(book__id__exact=book.id, deleted=False).order_by(orderby) + + # RISK - inner join queries + objects = objects.select_related(); + objects_list = Paginator(objects, user_page_size) + questions = objects_list.page(page) + + return render_to_response('book.html', { + "book": book, + "author_info": author_info, + "author_rss": author_rss, + "questions": questions, + "context": { + 'is_paginated': True, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': questions.has_previous(), + 'has_next': questions.has_next(), + 'previous': questions.previous_page_number(), + 'next': questions.next_page_number(), + 'base_url': request.path + '?sort=%s&' % view_id, + 'pagesize': user_page_size + } + }, context_instance=RequestContext(request)) + +@login_required +def ask_book(request, short_name): + if request.method == "POST": + form = AskForm(request.POST) + if form.is_valid(): + added_at = datetime.datetime.now() + html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) + question = Question( + title=strip_tags(form.cleaned_data['title']), + author=request.user, + added_at=added_at, + last_activity_at=added_at, + last_activity_by=request.user, + wiki=form.cleaned_data['wiki'], + tagnames=form.cleaned_data['tags'].strip(), + html=html, + summary=strip_tags(html)[:120] + ) + if question.wiki: + question.last_edited_by = question.author + question.last_edited_at = added_at + question.wikified_at = added_at + + question.save() + + # create the first revision + QuestionRevision.objects.create( + question=question, + revision=1, + title=question.title, + author=request.user, + revised_at=added_at, + tagnames=question.tagnames, + summary=CONST['default_version'], + text=form.cleaned_data['text'] + ) + + books = Book.objects.extra(where=['short_name = %s'], params=[short_name]) + match_count = len(books) + if match_count == 1: + # the book info + book = books[0] + book.questions.add(question) + + return HttpResponseRedirect(question.get_absolute_url()) + else: + form = AskForm() + + tags = _get_tags_cache_json() + return render_to_response('ask.html', { + 'form' : form, + 'tags' : tags, + 'email_validation_faq_url': reverse('faq') + '#validate', + }, context_instance=RequestContext(request)) + +def search(request): + """ + Search by question, user and tag keywords. + For questions now we only search keywords in question title. + """ + if request.method == "GET": + keywords = request.GET.get("q") + search_type = request.GET.get("t") + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + if keywords is None: + return HttpResponseRedirect(reverse(index)) + if search_type == 'tag': + return HttpResponseRedirect(reverse('tags') + '?q=%s&page=%s' % (keywords.strip(), page)) + elif search_type == "user": + return HttpResponseRedirect(reverse('users') + '?q=%s&page=%s' % (keywords.strip(), page)) + elif search_type == "question": + + template_file = "questions.html" + # Set flag to False by default. If it is equal to True, then need to be saved. + pagesize_changed = False + # get pagesize from session, if failed then get default value + user_page_size = request.session.get("pagesize", QUESTIONS_PAGE_SIZE) + # set pagesize equal to logon user specified value in database + if request.user.is_authenticated() and request.user.questions_per_page > 0: + user_page_size = request.user.questions_per_page + + try: + page = int(request.GET.get('page', '1')) + # get new pagesize from UI selection + pagesize = int(request.GET.get('pagesize', user_page_size)) + if pagesize <> user_page_size: + pagesize_changed = True + + except ValueError: + page = 1 + pagesize = user_page_size + + # save this pagesize to user database + if pagesize_changed: + request.session["pagesize"] = pagesize + if request.user.is_authenticated(): + user = request.user + user.questions_per_page = pagesize + user.save() + + view_id = request.GET.get('sort', None) + view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score"} + try: + orderby = view_dic[view_id] + except KeyError: + view_id = "latest" + orderby = "-added_at" + + if settings.USE_PG_FTS: + objects = Question.objects.filter(deleted=False).extra( + select={ + 'ranking': "ts_rank_cd(tsv, plainto_tsquery(%s), 32)", + }, + where=["tsv @@ plainto_tsquery(%s)"], + params=[keywords], + select_params=[keywords] + ).order_by('-ranking') + + elif settings.USE_SPHINX_SEARCH == True: + #search index is now free of delete questions and answers + #so there is not "antideleted" filtering here + objects = Question.search.query(keywords) + #no related selection either because we're relying on full text search here + else: + objects = Question.objects.filter(deleted=False).extra(where=['title like %s'], params=['%' + keywords + '%']).order_by(orderby) + # RISK - inner join queries + objects = objects.select_related(); + + objects_list = Paginator(objects, pagesize) + questions = objects_list.page(page) + + # Get related tags from this page objects + related_tags = [] + for question in questions.object_list: + tags = list(question.tags.all()) + for tag in tags: + if tag not in related_tags: + related_tags.append(tag) + + #if is_search is true in the context, prepend this string to soting tabs urls + search_uri = "?q=%s&page=%d&t=question" % ("+".join(keywords.split()), page) + + return render_to_response(template_file, { + "questions" : questions, + "tab_id" : view_id, + "questions_count" : objects_list.count, + "tags" : related_tags, + "searchtag" : None, + "searchtitle" : keywords, + "keywords" : keywords, + "is_unanswered" : False, + "is_search": True, + "search_uri": search_uri, + "context" : { + 'is_paginated' : True, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': questions.has_previous(), + 'has_next': questions.has_next(), + 'previous': questions.previous_page_number(), + 'next': questions.next_page_number(), + 'base_url' : request.path + '?t=question&q=%s&sort=%s&' % (keywords, view_id), + 'pagesize' : pagesize + }}, context_instance=RequestContext(request)) + + else: + raise Http404 diff --git a/junk.py b/junk.py new file mode 100644 index 00000000..c6c03d27 --- /dev/null +++ b/junk.py @@ -0,0 +1,3 @@ +import os + +print os.path.normpath('/haha//haha') diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo Binary files differindex 38120e49..b87457df 100644 --- a/locale/en/LC_MESSAGES/django.mo +++ b/locale/en/LC_MESSAGES/django.mo diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index bfec60c0..3b8a13cd 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/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-02-08 18:43-0500\n" +"POT-Creation-Date: 2010-02-16 00:17-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -74,12 +74,12 @@ msgstr "" #: django_authopenid/forms.py:320 msgid "Incorrect username." -msgstr "sorry, there is no such user name" +msgstr "" #: django_authopenid/urls.py:23 django_authopenid/urls.py:24 #: django_authopenid/urls.py:25 django_authopenid/urls.py:27 #: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 -#: forum/urls.py:29 +#: forum/urls.py:30 msgid "signin/" msgstr "" @@ -149,7 +149,7 @@ msgstr "" msgid "openid/" msgstr "" -#: django_authopenid/urls.py:43 forum/urls.py:49 forum/urls.py:53 +#: django_authopenid/urls.py:43 forum/urls.py:50 forum/urls.py:54 msgid "delete/" msgstr "" @@ -168,7 +168,7 @@ msgstr "" #: django_authopenid/views.py:593 msgid "Welcome email subject line" -msgstr "Welcome to the Q&A forum" +msgstr "" #: django_authopenid/views.py:699 msgid "Password changed." @@ -178,12 +178,10 @@ msgstr "" #, 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>." #: django_authopenid/views.py:738 msgid "Email verification subject line" -msgstr "Verification Email from Q&A forum" +msgstr "" #: django_authopenid/views.py:829 msgid "your email was not changed" @@ -294,7 +292,7 @@ msgstr "" msgid "question" msgstr "" -#: forum/const.py:58 templates/book.html:110 +#: forum/const.py:58 forum/skins/default/templates/book.html:110 msgid "answer" msgstr "" @@ -316,7 +314,7 @@ msgstr "" #: forum/const.py:63 msgid "received award" -msgstr "received badge" +msgstr "" #: forum/const.py:64 msgid "marked best answer" @@ -370,7 +368,8 @@ msgstr "" msgid "[deleted]" msgstr "" -#: forum/const.py:87 forum/views.py:796 forum/views.py:815 +#: forum/const.py:87 forum/views.py:792 forum/views.py:811 +#: forum/views/content.py:560 forum/views/content.py:579 msgid "initial version" msgstr "" @@ -394,9 +393,10 @@ msgstr "" msgid "latest questions" msgstr "" -#: forum/forms.py:18 templates/answer_edit_tips.html:35 -#: templates/answer_edit_tips.html.py:39 templates/question_edit_tips.html:32 -#: templates/question_edit_tips.html:37 +#: forum/forms.py:18 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 msgid "title" msgstr "" @@ -416,7 +416,8 @@ msgstr "" msgid "question content must be > 10 characters" msgstr "" -#: forum/forms.py:49 templates/header.html:28 templates/header.html.py:56 +#: forum/forms.py:49 forum/skins/default/templates/header.html:28 +#: forum/skins/default/templates/header.html:56 msgid "tags" msgstr "" @@ -425,7 +426,7 @@ msgid "" "Tags are short keywords, with no spaces within. Up to five tags can be used." msgstr "" -#: forum/forms.py:58 templates/question_retag.html:39 +#: forum/forms.py:58 forum/skins/default/templates/question_retag.html:39 msgid "tags are required" msgstr "" @@ -443,11 +444,16 @@ msgid "" "characters '.-_#'" msgstr "" -#: forum/forms.py:81 templates/index.html:61 templates/index.html.py:73 -#: templates/post_contributor_info.html:7 -#: templates/question_summary_list_roll.html:26 -#: templates/question_summary_list_roll.html:38 templates/questions.html:92 -#: templates/questions.html.py:104 +#: forum/forms.py:81 forum/skins/default/templates/index.html:62 +#: forum/skins/default/templates/index.html:74 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +#: forum/skins/default/templates/questions.html:97 +#: forum/skins/default/templates/questions.html:109 +#: forum/skins/default/templates/questions.html:366 +#: forum/skins/default/templates/questions.html:378 +#: templates/unanswered.html:51 templates/unanswered.html.py:63 msgid "community wiki" msgstr "" @@ -483,83 +489,84 @@ msgstr "" msgid "Your message:" msgstr "" -#: forum/forms.py:202 +#: forum/forms.py:203 msgid "this email does not have to be linked to gravatar" msgstr "" -#: forum/forms.py:204 +#: forum/forms.py:205 msgid "Screen name" msgstr "" -#: forum/forms.py:205 +#: forum/forms.py:206 msgid "Real name" msgstr "" -#: forum/forms.py:206 +#: forum/forms.py:207 msgid "Website" msgstr "" -#: forum/forms.py:207 +#: forum/forms.py:208 msgid "Location" msgstr "" -#: forum/forms.py:208 +#: forum/forms.py:209 msgid "Date of birth" msgstr "" -#: forum/forms.py:208 +#: forum/forms.py:209 msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" msgstr "" -#: forum/forms.py:209 templates/authopenid/settings.html:21 +#: forum/forms.py:210 +#: forum/skins/default/templates/authopenid/settings.html:21 msgid "Profile" msgstr "" -#: forum/forms.py:240 forum/forms.py:241 +#: forum/forms.py:241 forum/forms.py:242 msgid "this email has already been registered, please use another one" msgstr "" -#: forum/forms.py:247 +#: forum/forms.py:248 msgid "Choose email tag filter" msgstr "" -#: forum/forms.py:262 forum/forms.py:263 +#: forum/forms.py:263 forum/forms.py:264 msgid "weekly" msgstr "" -#: forum/forms.py:262 forum/forms.py:263 +#: forum/forms.py:263 forum/forms.py:264 msgid "no email" msgstr "" -#: forum/forms.py:263 +#: forum/forms.py:264 msgid "daily" msgstr "" -#: forum/forms.py:278 +#: forum/forms.py:279 msgid "Asked by me" msgstr "" -#: forum/forms.py:281 +#: forum/forms.py:282 msgid "Answered by me" msgstr "" -#: forum/forms.py:284 +#: forum/forms.py:285 msgid "Individually selected" msgstr "" -#: forum/forms.py:287 +#: forum/forms.py:288 msgid "Entire forum (tag filtered)" msgstr "" -#: forum/forms.py:341 +#: forum/forms.py:342 msgid "okay, let's try!" msgstr "" -#: forum/forms.py:342 +#: forum/forms.py:343 msgid "no OSQA community email please, thanks" msgstr "" -#: forum/forms.py:345 +#: forum/forms.py:346 msgid "please choose one of the options above" msgstr "" @@ -624,286 +631,201 @@ msgstr "" msgid "ignored" msgstr "" -#: forum/models.py:541 templates/badges.html:53 +#: forum/models.py:541 forum/skins/default/templates/badges.html:53 msgid "gold" msgstr "" -#: forum/models.py:542 templates/badges.html:61 +#: forum/models.py:542 forum/skins/default/templates/badges.html:61 msgid "silver" msgstr "" -#: forum/models.py:543 templates/badges.html:68 +#: forum/models.py:543 forum/skins/default/templates/badges.html:68 msgid "bronze" msgstr "" -#: forum/urls.py:26 +#: forum/urls.py:27 msgid "upfiles/" msgstr "" -#: forum/urls.py:30 +#: forum/urls.py:31 msgid "about/" msgstr "" -#: forum/urls.py:31 +#: forum/urls.py:32 msgid "faq/" msgstr "" -#: forum/urls.py:32 +#: forum/urls.py:33 msgid "privacy/" msgstr "" -#: forum/urls.py:33 +#: forum/urls.py:34 msgid "logout/" msgstr "" -#: forum/urls.py:34 forum/urls.py:35 forum/urls.py:36 forum/urls.py:53 +#: forum/urls.py:35 forum/urls.py:36 forum/urls.py:37 forum/urls.py:54 msgid "answers/" msgstr "" -#: forum/urls.py:34 forum/urls.py:46 forum/urls.py:49 forum/urls.py:53 +#: forum/urls.py:35 forum/urls.py:47 forum/urls.py:50 forum/urls.py:54 msgid "comments/" msgstr "" -#: forum/urls.py:35 forum/urls.py:40 forum/urls.py:75 -#: templates/user_info.html:45 +#: forum/urls.py:36 forum/urls.py:41 forum/urls.py:76 +#: forum/skins/default/templates/user_info.html:45 msgid "edit/" msgstr "" -#: forum/urls.py:36 forum/urls.py:45 +#: forum/urls.py:37 forum/urls.py:46 msgid "revisions/" msgstr "" -#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:40 -#: forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 forum/urls.py:44 -#: forum/urls.py:45 forum/urls.py:46 forum/urls.py:49 +#: forum/urls.py:38 forum/urls.py:39 forum/urls.py:40 forum/urls.py:41 +#: forum/urls.py:42 forum/urls.py:43 forum/urls.py:44 forum/urls.py:45 +#: forum/urls.py:46 forum/urls.py:47 forum/urls.py:50 msgid "questions/" msgstr "" -#: forum/urls.py:38 forum/urls.py:85 +#: forum/urls.py:39 forum/urls.py:86 msgid "ask/" msgstr "" -#: forum/urls.py:39 +#: forum/urls.py:40 msgid "unanswered/" msgstr "" -#: forum/urls.py:41 +#: forum/urls.py:42 msgid "close/" msgstr "" -#: forum/urls.py:42 +#: forum/urls.py:43 msgid "reopen/" msgstr "" -#: forum/urls.py:43 +#: forum/urls.py:44 msgid "answer/" msgstr "" -#: forum/urls.py:44 +#: forum/urls.py:45 msgid "vote/" msgstr "" -#: forum/urls.py:47 +#: forum/urls.py:48 msgid "command/" msgstr "" -#: forum/urls.py:57 forum/views.py:440 +#: forum/urls.py:58 forum/views.py:437 forum/views/content.py:431 msgid "question/" msgstr "" -#: forum/urls.py:58 forum/urls.py:59 +#: forum/urls.py:59 forum/urls.py:60 msgid "tags/" msgstr "" -#: forum/urls.py:61 forum/urls.py:65 +#: forum/urls.py:62 forum/urls.py:66 msgid "mark-tag/" msgstr "" -#: forum/urls.py:61 +#: forum/urls.py:62 msgid "interesting/" msgstr "" -#: forum/urls.py:65 +#: forum/urls.py:66 msgid "ignored/" msgstr "" -#: forum/urls.py:69 +#: forum/urls.py:70 msgid "unmark-tag/" msgstr "" -#: forum/urls.py:73 forum/urls.py:75 forum/urls.py:76 +#: forum/urls.py:74 forum/urls.py:76 forum/urls.py:77 msgid "users/" msgstr "" -#: forum/urls.py:74 +#: forum/urls.py:75 msgid "moderate-user/" msgstr "" -#: forum/urls.py:77 forum/urls.py:78 +#: forum/urls.py:78 forum/urls.py:79 msgid "badges/" msgstr "" -#: forum/urls.py:79 +#: forum/urls.py:80 msgid "messages/" msgstr "" -#: forum/urls.py:79 +#: forum/urls.py:80 msgid "markread/" msgstr "" -#: forum/urls.py:81 +#: forum/urls.py:82 msgid "nimda/" msgstr "" -#: forum/urls.py:83 +#: forum/urls.py:84 msgid "upload/" msgstr "" -#: forum/urls.py:84 forum/urls.py:85 forum/urls.py:86 +#: forum/urls.py:85 forum/urls.py:86 forum/urls.py:87 msgid "books/" msgstr "" -#: forum/urls.py:87 +#: forum/urls.py:88 msgid "search/" msgstr "" -#: forum/urls.py:88 +#: forum/urls.py:89 msgid "feedback/" msgstr "" -#: forum/urls.py:89 forum/urls.py:90 +#: forum/urls.py:90 forum/urls.py:91 msgid "account/" msgstr "" -#: forum/user.py:16 templates/user_tabs.html:7 -msgid "overview" -msgstr "" - -#: forum/user.py:17 -msgid "user profile" -msgstr "" - -#: forum/user.py:18 -msgid "user profile overview" -msgstr "" - -#: forum/user.py:24 templates/user_tabs.html:9 -msgid "recent activity" -msgstr "" - -#: forum/user.py:25 -msgid "recent user activity" -msgstr "" - -#: forum/user.py:26 -msgid "profile - recent activity" -msgstr "" - -#: forum/user.py:33 templates/user_tabs.html:13 -msgid "responses" -msgstr "" - -#: forum/user.py:34 templates/user_tabs.html:12 -msgid "comments and answers to others questions" -msgstr "" - -#: forum/user.py:35 -msgid "profile - responses" -msgstr "" - -#: forum/user.py:42 templates/user_info.html:22 templates/users.html:26 -msgid "reputation" -msgstr "karma" - -#: forum/user.py:43 -msgid "user reputation in the community" -msgstr "user karma" - -#: forum/user.py:44 -msgid "profile - user reputation" -msgstr "Profile - User's Karma" - -#: forum/user.py:50 -msgid "favorite questions" -msgstr "" - -#: forum/user.py:51 -msgid "users favorite questions" -msgstr "" - -#: forum/user.py:52 -msgid "profile - favorite questions" -msgstr "" - -#: forum/user.py:59 templates/user_tabs.html:20 -msgid "casted votes" -msgstr "votes" - -#: forum/user.py:60 templates/user_tabs.html:20 -msgid "user vote record" -msgstr "" - -#: forum/user.py:61 -msgid "profile - votes" -msgstr "" - -#: forum/user.py:68 templates/user_tabs.html:28 -msgid "email subscriptions" -msgstr "" - -#: forum/user.py:69 templates/user_tabs.html:27 -msgid "email subscription settings" -msgstr "" - -#: forum/user.py:70 -msgid "profile - email subscriptions" -msgstr "" - -#: forum/views.py:141 +#: forum/views.py:141 forum/views/meta.py:33 msgid "Q&A forum feedback" msgstr "" -#: forum/views.py:142 +#: forum/views.py:142 forum/views/meta.py:34 msgid "Thanks for the feedback!" msgstr "" -#: forum/views.py:150 +#: forum/views.py:150 forum/views/meta.py:42 msgid "We look forward to hearing your feedback! Please, give it next time :)" msgstr "" -#: forum/views.py:1098 +#: forum/views.py:1095 forum/views/content.py:1327 #, python-format msgid "subscription saved, %(email)s needs validation, see %(details_url)s" msgstr "" -"Your subscription is saved, but email address %(email)s needs to be " -"validated, please see <a href='%(details_url)s'>more details here</a>" -#: forum/views.py:1106 +#: forum/views.py:1103 forum/views/content.py:1335 msgid "email update frequency has been set to daily" msgstr "" -#: forum/views.py:1982 forum/views.py:1986 +#: forum/views.py:1980 forum/views.py:1984 forum/views/users.py:836 +#: forum/views/users.py:840 msgid "changes saved" msgstr "" -#: forum/views.py:1992 +#: forum/views.py:1990 forum/views/users.py:846 msgid "email updates canceled" msgstr "" -#: forum/views.py:2159 +#: forum/views.py:2157 forum/views/content.py:713 msgid "uploading images is limited to users with >60 reputation points" -msgstr "sorry, file uploading requires karma >60" +msgstr "" -#: forum/views.py:2161 +#: forum/views.py:2159 forum/views/content.py:715 msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" msgstr "" -#: forum/views.py:2163 +#: forum/views.py:2161 forum/views/content.py:717 #, python-format msgid "maximum upload file size is %sK" msgstr "" -#: forum/views.py:2165 +#: forum/views.py:2163 forum/views/content.py:719 #, python-format msgid "" "Error uploading file. Please contact the site administrator. Thank you. %s" @@ -911,18 +833,14 @@ msgstr "" #: forum/management/commands/send_email_alerts.py:156 msgid "email update message subject" -msgstr "news from Q&A forum" +msgstr "" #: forum/management/commands/send_email_alerts.py:158 #, python-format msgid "%(name)s, this is an update message header for a question" msgid_plural "%(name)s, this is an update message header for %(num)d questions" msgstr[0] "" -"<p>Dear %(name)s,</p></p>The following question has been updated on the Q&A " -"forum:</p>" msgstr[1] "" -"<p>Dear %(name)s,</p><p>The following %(num)d questions have been updated on " -"the Q&A forum:</p>" #: forum/management/commands/send_email_alerts.py:169 msgid "new question" @@ -947,289 +865,280 @@ msgid "" "go to %(link)s to change frequency of email updates or %(email)s " "administrator" msgstr "" -"<p>Please remember that you can always <a href='%(link)s'>adjust</a> " -"frequency of the email updates or turn them off entirely.<br/>If you believe " -"that this message was sent in an error, please email about it the forum " -"administrator at %(email)s.</p><p>Sincerely,</p><p>Your friendly Q&A forum " -"server.</p>" - -#: forum/templatetags/extra_tags.py:164 forum/templatetags/extra_tags.py:193 -#: templates/header.html:33 -msgid "badges" -msgstr "" - -#: forum/templatetags/extra_tags.py:165 forum/templatetags/extra_tags.py:192 -msgid "reputation points" -msgstr "karma" - -#: forum/templatetags/extra_tags.py:252 -msgid "2 days ago" -msgstr "" -#: forum/templatetags/extra_tags.py:254 -msgid "yesterday" -msgstr "" - -#: forum/templatetags/extra_tags.py:256 -#, python-format -msgid "%(hr)d hour ago" -msgid_plural "%(hr)d hours ago" -msgstr[0] "" -msgstr[1] "" - -#: forum/templatetags/extra_tags.py:258 -#, python-format -msgid "%(min)d min ago" -msgid_plural "%(min)d mins ago" -msgstr[0] "" -msgstr[1] "" - -#: middleware/anon_user.py:33 -#, python-format -msgid "first time greeting with %(url)s" -msgstr "" - -#: templates/404.html:24 +#: forum/skins/default/templates/404.html:24 msgid "Sorry, could not find the page you requested." msgstr "" -#: templates/404.html:26 +#: forum/skins/default/templates/404.html:26 msgid "This might have happened for the following reasons:" msgstr "" -#: templates/404.html:28 +#: forum/skins/default/templates/404.html:28 msgid "this question or answer has been deleted;" msgstr "" -#: templates/404.html:29 +#: forum/skins/default/templates/404.html:29 msgid "url has error - please check it;" msgstr "" -#: templates/404.html:30 +#: forum/skins/default/templates/404.html:30 msgid "" "the page you tried to visit is protected or you don't have sufficient " "points, see" msgstr "" -#: templates/404.html:31 +#: forum/skins/default/templates/404.html:31 msgid "if you believe this error 404 should not have occured, please" msgstr "" -#: templates/404.html:32 +#: forum/skins/default/templates/404.html:32 msgid "report this problem" msgstr "" -#: templates/404.html:41 templates/500.html:27 +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 msgid "back to previous page" msgstr "" -#: templates/404.html:42 +#: forum/skins/default/templates/404.html:42 msgid "see all questions" msgstr "" -#: templates/404.html:43 +#: forum/skins/default/templates/404.html:43 msgid "see all tags" msgstr "" -#: templates/500.html:22 +#: forum/skins/default/templates/500.html:22 msgid "sorry, system error" msgstr "" -#: templates/500.html:24 +#: forum/skins/default/templates/500.html:24 msgid "system error log is recorded, error will be fixed as soon as possible" msgstr "" -#: templates/500.html:25 +#: forum/skins/default/templates/500.html:25 msgid "please report the error to the site administrators if you wish" msgstr "" -#: templates/500.html:28 +#: forum/skins/default/templates/500.html:28 msgid "see latest questions" msgstr "" -#: templates/500.html:29 +#: forum/skins/default/templates/500.html:29 msgid "see tags" msgstr "" -#: templates/about.html:6 templates/about.html.py:11 +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 msgid "About" msgstr "" -#: templates/answer_edit.html:5 templates/answer_edit.html.py:48 +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 msgid "Edit answer" msgstr "" -#: templates/answer_edit.html:25 templates/answer_edit.html.py:28 -#: templates/ask.html:26 templates/ask.html.py:29 templates/question.html:45 -#: templates/question.html.py:48 templates/question_edit.html:25 -#: templates/question_edit.html.py:28 +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question.html:565 +#: forum/skins/default/templates/question.html:568 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 msgid "hide preview" msgstr "" -#: templates/answer_edit.html:28 templates/ask.html:29 -#: templates/question.html:48 templates/question_edit.html:28 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question.html:568 +#: forum/skins/default/templates/question_edit.html:28 msgid "show preview" msgstr "" -#: templates/answer_edit.html:48 templates/question_edit.html:66 -#: templates/question_retag.html:53 templates/revisions_answer.html:38 -#: templates/revisions_question.html:38 +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 msgid "back" msgstr "" -#: templates/answer_edit.html:53 templates/question_edit.html:71 -#: templates/revisions_answer.html:52 templates/revisions_question.html:52 +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 msgid "revision" msgstr "" -#: templates/answer_edit.html:56 templates/question_edit.html:75 +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 msgid "select revision" msgstr "" -#: templates/answer_edit.html:63 templates/ask.html:97 -#: templates/question.html:434 templates/question_edit.html:92 +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:97 +#: forum/skins/default/templates/question.html:443 +#: forum/skins/default/templates/question.html:952 +#: forum/skins/default/templates/question_edit.html:92 msgid "Toggle the real time Markdown editor preview" msgstr "" -#: templates/answer_edit.html:63 templates/ask.html:97 -#: templates/question.html:435 templates/question_edit.html:92 +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:97 +#: forum/skins/default/templates/question.html:444 +#: forum/skins/default/templates/question.html:953 +#: forum/skins/default/templates/question_edit.html:92 msgid "toggle preview" msgstr "" -#: templates/answer_edit.html:72 templates/question_edit.html:118 -#: templates/question_retag.html:74 +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:124 +#: forum/skins/default/templates/question_retag.html:74 msgid "Save edit" msgstr "" -#: templates/answer_edit.html:73 templates/close.html:29 -#: templates/feedback.html:50 templates/question_edit.html:119 -#: templates/question_retag.html:75 templates/reopen.html:30 -#: templates/user_edit.html:87 templates/authopenid/changeemail.html:40 +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:125 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:87 +#: forum/skins/default/templates/authopenid/changeemail.html:40 msgid "Cancel" msgstr "" -#: templates/answer_edit_tips.html:4 +#: forum/skins/default/templates/answer_edit_tips.html:4 msgid "answer tips" -msgstr "Tips" +msgstr "" -#: templates/answer_edit_tips.html:7 +#: forum/skins/default/templates/answer_edit_tips.html:7 msgid "please make your answer relevant to this community" msgstr "" -#: templates/answer_edit_tips.html:10 +#: forum/skins/default/templates/answer_edit_tips.html:10 msgid "try to give an answer, rather than engage into a discussion" msgstr "" -#: templates/answer_edit_tips.html:13 +#: forum/skins/default/templates/answer_edit_tips.html:13 msgid "please try to provide details" msgstr "" -#: templates/answer_edit_tips.html:16 templates/question_edit_tips.html:13 +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 msgid "be clear and concise" msgstr "" -#: templates/answer_edit_tips.html:20 templates/question_edit_tips.html:17 +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 msgid "see frequently asked questions" msgstr "" -#: templates/answer_edit_tips.html:26 templates/question_edit_tips.html:23 +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 msgid "Markdown tips" -msgstr "Markdown basics" +msgstr "" -#: templates/answer_edit_tips.html:29 templates/question_edit_tips.html:26 +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 msgid "*italic* or __italic__" msgstr "" -#: templates/answer_edit_tips.html:32 templates/question_edit_tips.html:29 +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 msgid "**bold** or __bold__" msgstr "" -#: templates/answer_edit_tips.html:35 templates/question_edit_tips.html:32 +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 msgid "link" msgstr "" -#: templates/answer_edit_tips.html:35 templates/answer_edit_tips.html.py:39 -#: templates/question_edit_tips.html:32 templates/question_edit_tips.html:37 +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 msgid "text" msgstr "" -#: templates/answer_edit_tips.html:39 templates/question_edit_tips.html:37 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 msgid "image" msgstr "" -#: templates/answer_edit_tips.html:43 templates/question_edit_tips.html:41 +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 msgid "numbered list:" msgstr "" -#: templates/answer_edit_tips.html:48 templates/question_edit_tips.html:46 +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 msgid "basic HTML tags are also supported" msgstr "" -#: templates/answer_edit_tips.html:52 templates/question_edit_tips.html:50 +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 msgid "learn more about Markdown" msgstr "" -#: templates/ask.html:5 templates/ask.html.py:61 +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:61 msgid "Ask a question" msgstr "" -#: templates/ask.html:68 +#: forum/skins/default/templates/ask.html:68 msgid "login to post question info" msgstr "" -"<span class=\"strong big\">You are welcome to start submitting your question " -"anonymously</span>. When you submit the post, you will be redirected to the " -"login/signup page. Your question will be saved in the current session and " -"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." -#: templates/ask.html:74 +#: forum/skins/default/templates/ask.html:74 #, python-format msgid "" "must have valid %(email)s to post, \n" " see %(email_validation_faq_url)s\n" " " msgstr "" -"<span class='strong big'>Looks like your email address, %(email)s has not " -"yet been validated.</span> To post messages you must verify your email, " -"please see <a href='%(email_validation_faq_url)s'>more details here</a>." -"<br>You can submit your question now and validate email after that. Your " -"question will saved as pending meanwhile. " -#: templates/ask.html:112 +#: forum/skins/default/templates/ask.html:112 +#: forum/skins/default/templates/ask.html:119 +#: forum/skins/default/templates/question_edit.html:120 msgid "(required)" msgstr "" -#: templates/ask.html:119 +#: forum/skins/default/templates/ask.html:126 msgid "Login/signup to post your question" -msgstr "Login/Signup to Post" +msgstr "" -#: templates/ask.html:121 +#: forum/skins/default/templates/ask.html:128 msgid "Ask your question" -msgstr "Ask Your Question" +msgstr "" -#: templates/badge.html:6 templates/badge.html.py:17 +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 msgid "Badge" msgstr "" -#: templates/badge.html:26 +#: forum/skins/default/templates/badge.html:26 msgid "The users have been awarded with badges:" msgstr "" -#: templates/badges.html:6 +#: forum/skins/default/templates/badges.html:6 msgid "Badges summary" msgstr "" -#: templates/badges.html:17 +#: forum/skins/default/templates/badges.html:17 msgid "Badges" msgstr "" -#: templates/badges.html:21 +#: forum/skins/default/templates/badges.html:21 msgid "Community gives you awards for your questions, answers and votes." msgstr "" -"If your questions and answers are highly voted, your contribution to this " -"Q&A community will be recognized with the variety of badges." -#: templates/badges.html:22 +#: forum/skins/default/templates/badges.html:22 #, python-format msgid "" "Below is the list of available badges and number \n" @@ -1237,232 +1146,228 @@ msgid "" "(feedback_faq_url)s.\n" " " msgstr "" -"Currently badges differ only by their level: <strong>gold</strong>, " -"<strong>silver</strong> and <strong>bronze</strong> (their meanings are " -"described on the right). In the future there will be many types of badges at " -"each level. <strong>Please give us your <a href='%(feedback_faq_url)" -"s'>feedback</a></strong> - what kinds of badges would you like to see and " -"suggest the activity for which those badges might be awarded." -#: templates/badges.html:50 +#: forum/skins/default/templates/badges.html:50 msgid "Community badges" -msgstr "Badge levels" +msgstr "" -#: templates/badges.html:56 +#: forum/skins/default/templates/badges.html:56 msgid "gold badge description" msgstr "" -"Gold badge is the highest award in this community. To obtain it have to show " -"profound knowledge and ability in addition to your active participation." -#: templates/badges.html:64 +#: forum/skins/default/templates/badges.html:64 msgid "silver badge description" msgstr "" -"Obtaining silver badge requires significant patience. If you have received " -"one, that means you have greatly contributed to this community." -#: templates/badges.html:67 +#: forum/skins/default/templates/badges.html:67 msgid "bronze badge: often given as a special honor" msgstr "" -#: templates/badges.html:71 +#: forum/skins/default/templates/badges.html:71 msgid "bronze badge description" msgstr "" -"If you are an active participant in this community, you will be recognized " -"with this badge." -#: templates/book.html:7 +#: forum/skins/default/templates/book.html:7 msgid "reading channel" msgstr "" -#: templates/book.html:26 +#: forum/skins/default/templates/book.html:26 msgid "[author]" msgstr "" -#: templates/book.html:30 +#: forum/skins/default/templates/book.html:30 msgid "[publisher]" msgstr "" -#: templates/book.html:34 +#: forum/skins/default/templates/book.html:34 msgid "[publication date]" msgstr "" -#: templates/book.html:38 +#: forum/skins/default/templates/book.html:38 msgid "[price]" msgstr "" -#: templates/book.html:39 +#: forum/skins/default/templates/book.html:39 msgid "currency unit" msgstr "" -#: templates/book.html:42 +#: forum/skins/default/templates/book.html:42 msgid "[pages]" msgstr "" -#: templates/book.html:43 +#: forum/skins/default/templates/book.html:43 msgid "pages abbreviation" msgstr "" -#: templates/book.html:46 +#: forum/skins/default/templates/book.html:46 msgid "[tags]" msgstr "" -#: templates/book.html:56 +#: forum/skins/default/templates/book.html:56 msgid "author blog" msgstr "" -#: templates/book.html:62 +#: forum/skins/default/templates/book.html:62 msgid "book directory" msgstr "" -#: templates/book.html:66 +#: forum/skins/default/templates/book.html:66 msgid "buy online" msgstr "" -#: templates/book.html:79 +#: forum/skins/default/templates/book.html:79 msgid "reader questions" msgstr "" -#: templates/book.html:82 +#: forum/skins/default/templates/book.html:82 msgid "ask the author" msgstr "" -#: templates/book.html:88 templates/book.html.py:93 -#: templates/users_questions.html:18 +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 msgid "this question was selected as favorite" msgstr "" -#: templates/book.html:88 templates/book.html.py:93 -#: templates/users_questions.html:11 templates/users_questions.html.py:18 +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 msgid "number of times" msgstr "" -#: templates/book.html:105 templates/index.html:49 -#: templates/question_summary_list_roll.html:14 templates/questions.html:80 -#: templates/users_questions.html:32 +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/index.html:50 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +#: forum/skins/default/templates/questions.html:85 +#: forum/skins/default/templates/questions.html:354 +#: forum/skins/default/templates/users_questions.html:32 +#: templates/unanswered.html:39 msgid "votes" msgstr "" -#: templates/book.html:108 +#: forum/skins/default/templates/book.html:108 msgid "the answer has been accepted to be correct" msgstr "" -#: templates/book.html:115 templates/index.html:50 -#: templates/question_summary_list_roll.html:15 templates/questions.html:81 -#: templates/users_questions.html:40 +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/index.html:51 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +#: forum/skins/default/templates/questions.html:86 +#: forum/skins/default/templates/questions.html:355 +#: forum/skins/default/templates/users_questions.html:40 +#: templates/unanswered.html:40 msgid "views" msgstr "" -#: templates/book.html:125 templates/index.html:105 -#: templates/question.html:480 templates/question_summary_list_roll.html:52 -#: templates/questions.html:136 templates/tags.html:49 -#: templates/users_questions.html:52 +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/index.html:106 +#: forum/skins/default/templates/question.html:489 +#: forum/skins/default/templates/question.html:998 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/questions.html:141 +#: forum/skins/default/templates/questions.html:258 +#: forum/skins/default/templates/questions.html:410 +#: forum/skins/default/templates/tags.html:49 +#: forum/skins/default/templates/users_questions.html:52 +#: templates/unanswered.html:95 templates/unanswered.html.py:122 msgid "using tags" msgstr "" -#: templates/book.html:147 +#: forum/skins/default/templates/book.html:147 msgid "subscribe to book RSS feed" msgstr "" -#: templates/book.html:147 templates/index.html:156 +#: forum/skins/default/templates/book.html:147 +#: forum/skins/default/templates/index.html:157 msgid "subscribe to the questions feed" msgstr "" -#: templates/close.html:6 templates/close.html.py:16 +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 msgid "Close question" msgstr "" -#: templates/close.html:19 +#: forum/skins/default/templates/close.html:19 msgid "Close the question" msgstr "" -#: templates/close.html:25 +#: forum/skins/default/templates/close.html:25 msgid "Reasons" msgstr "" -#: templates/close.html:28 +#: forum/skins/default/templates/close.html:28 msgid "OK to close" msgstr "" -#: templates/faq.html:11 +#: forum/skins/default/templates/faq.html:11 msgid "Frequently Asked Questions " msgstr "" -#: templates/faq.html:16 +#: forum/skins/default/templates/faq.html:16 msgid "What kinds of questions can I ask here?" msgstr "" -#: templates/faq.html:17 +#: forum/skins/default/templates/faq.html:17 msgid "" "Most importanly - questions should be <strong>relevant</strong> to this " "community." msgstr "" -#: templates/faq.html:18 +#: forum/skins/default/templates/faq.html:18 msgid "" "Before asking the question - please make sure to use search to see whether " "your question has alredy been answered." msgstr "" -"Before you ask - please make sure to search for a similar question. You can " -"search questions by their title or tags." -#: templates/faq.html:21 +#: forum/skins/default/templates/faq.html:21 msgid "What questions should I avoid asking?" -msgstr "What kinds of questions should be avoided?" +msgstr "" -#: templates/faq.html:22 +#: forum/skins/default/templates/faq.html:22 msgid "" "Please avoid asking questions that are not relevant to this community, too " "subjective and argumentative." msgstr "" -#: templates/faq.html:27 +#: forum/skins/default/templates/faq.html:27 msgid "What should I avoid in my answers?" msgstr "" -#: templates/faq.html:28 +#: forum/skins/default/templates/faq.html:28 msgid "" "is a Q&A site, not a discussion group. Therefore - please avoid having " "discussions in your answers, comment facility allows some space for brief " "discussions." msgstr "" -"is a <strong>question and answer</strong> site - <strong>it is not a " -"discussion group</strong>. Please avoid holding debates in your answers as " -"they tend to dilute the essense of questions and answers. For the brief " -"discussions please use commenting facility." -#: templates/faq.html:32 +#: forum/skins/default/templates/faq.html:32 msgid "Who moderates this community?" msgstr "" -#: templates/faq.html:33 +#: forum/skins/default/templates/faq.html:33 msgid "The short answer is: <strong>you</strong>." msgstr "" -#: templates/faq.html:34 +#: forum/skins/default/templates/faq.html:34 msgid "This website is moderated by the users." msgstr "" -#: templates/faq.html:35 +#: forum/skins/default/templates/faq.html:35 msgid "" "The reputation system allows users earn the authorization to perform a " "variety of moderation tasks." msgstr "" -"Karma system allows users to earn rights to perform a variety of moderation " -"tasks" -#: templates/faq.html:40 +#: forum/skins/default/templates/faq.html:40 msgid "How does reputation system work?" -msgstr "How does karma system work?" +msgstr "" -#: templates/faq.html:41 +#: forum/skins/default/templates/faq.html:41 msgid "Rep system summary" msgstr "" -"When a question or answer is upvoted, the user who posted them will gain " -"some points, which are called \"karma points\". These points serve as a " -"rough measure of the community trust to him/her. Various moderation tasks " -"are gradually assigned to the users based on those points." -#: templates/faq.html:42 +#: forum/skins/default/templates/faq.html:42 msgid "" "For example, if you ask an interesting question or give a helpful answer, " "your input will be upvoted. On the other hand if the answer is misleading - " @@ -1473,150 +1378,134 @@ msgid "" "type of moderation task." msgstr "" -#: templates/faq.html:53 templates/user_votes.html:15 +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 msgid "upvote" msgstr "" -#: templates/faq.html:57 +#: forum/skins/default/templates/faq.html:57 msgid "use tags" msgstr "" -#: templates/faq.html:62 +#: forum/skins/default/templates/faq.html:62 msgid "add comments" msgstr "" -#: templates/faq.html:66 templates/user_votes.html:17 +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 msgid "downvote" msgstr "" -#: templates/faq.html:69 +#: forum/skins/default/templates/faq.html:69 msgid "open and close own questions" msgstr "" -#: templates/faq.html:73 +#: forum/skins/default/templates/faq.html:73 msgid "retag questions" msgstr "" -#: templates/faq.html:78 +#: forum/skins/default/templates/faq.html:78 msgid "edit community wiki questions" msgstr "" -#: templates/faq.html:83 +#: forum/skins/default/templates/faq.html:83 msgid "edit any answer" msgstr "" -#: templates/faq.html:87 +#: forum/skins/default/templates/faq.html:87 msgid "open any closed question" msgstr "" -#: templates/faq.html:91 +#: forum/skins/default/templates/faq.html:91 msgid "delete any comment" msgstr "" -#: templates/faq.html:95 +#: forum/skins/default/templates/faq.html:95 msgid "delete any questions and answers and perform other moderation tasks" msgstr "" -#: templates/faq.html:102 +#: forum/skins/default/templates/faq.html:102 msgid "how to validate email title" -msgstr "How to validate email and why?" +msgstr "" -#: templates/faq.html:104 +#: forum/skins/default/templates/faq.html:104 #, python-format msgid "" "how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" msgstr "" -"<form style='margin:0;padding:0;' action='%(send_email_key_url)s'><p><span " -"class=\"bigger strong\">How?</span> If you have just set or changed your " -"email address - <strong>check your email and click the included link</" -"strong>.<br>The link contains a key generated specifically for you. You can " -"also <button style='display:inline' type='submit'><strong>get a new key</" -"strong></button> and check your email again.</p></form><span class=\"bigger " -"strong\">Why?</span> Email validation is required to make sure that " -"<strong>only you can post messages</strong> on your behalf and to " -"<strong>minimize spam</strong> posts.<br>With email you can " -"<strong>subscribe for updates</strong> on the most interesting questions. " -"Also, when you sign up for the first time - create a unique <a href='%" -"(gravatar_faq_url)s'><strong>gravatar</strong></a> personal image.</p>" - -#: templates/faq.html:108 + +#: forum/skins/default/templates/faq.html:108 msgid "what is gravatar" -msgstr "What is gravatar?" +msgstr "" -#: templates/faq.html:109 +#: forum/skins/default/templates/faq.html:109 msgid "gravatar faq info" msgstr "" -"<strong>Gravatar</strong> means <strong>g</strong>lobally <strong>r</" -"strong>ecognized <strong>avatar</strong> - your unique avatar image " -"associated with your email address. It's simply a picture that shows next to " -"your posts on the websites that support gravatar protocol. By default gravar " -"appears as a square filled with a snowflake-like figure. You can <strong>set " -"your image</strong> at <a href='http://gravatar.com'><strong>gravatar.com</" -"strong></a>" -#: templates/faq.html:112 +#: forum/skins/default/templates/faq.html:112 msgid "To register, do I need to create new password?" msgstr "" -#: templates/faq.html:113 +#: forum/skins/default/templates/faq.html:113 msgid "" "No, you don't have to. You can login through any service that supports " "OpenID, e.g. Google, Yahoo, AOL, etc." msgstr "" -#: templates/faq.html:114 +#: forum/skins/default/templates/faq.html:114 msgid "Login now!" msgstr "" -#: templates/faq.html:119 +#: forum/skins/default/templates/faq.html:119 msgid "Why other people can edit my questions/answers?" msgstr "" -#: templates/faq.html:120 +#: forum/skins/default/templates/faq.html:120 msgid "Goal of this site is..." msgstr "" -#: templates/faq.html:120 +#: forum/skins/default/templates/faq.html:120 msgid "" "So questions and answers can be edited like wiki pages by experienced users " "of this site and this improves the overall quality of the knowledge base " "content." msgstr "" -#: templates/faq.html:121 +#: forum/skins/default/templates/faq.html:121 msgid "If this approach is not for you, we respect your choice." msgstr "" -#: templates/faq.html:125 +#: forum/skins/default/templates/faq.html:125 msgid "Still have questions?" msgstr "" -#: templates/faq.html:126 +#: forum/skins/default/templates/faq.html:126 #, python-format msgid "" "Please ask your question at %(ask_question_url)s, help make our community " "better!" msgstr "" -"Please <a href='%(ask_question_url)s'>ask</a> your question, help make our " -"community better!" -#: templates/faq.html:128 templates/header.html:27 templates/header.html.py:55 +#: forum/skins/default/templates/faq.html:128 +#: forum/skins/default/templates/header.html:27 +#: forum/skins/default/templates/header.html:55 msgid "questions" msgstr "" -#: templates/faq.html:128 templates/index.html:161 +#: forum/skins/default/templates/faq.html:128 +#: forum/skins/default/templates/index.html:162 msgid "." msgstr "" -#: templates/feedback.html:6 +#: forum/skins/default/templates/feedback.html:6 msgid "Feedback" msgstr "" -#: templates/feedback.html:11 +#: forum/skins/default/templates/feedback.html:11 msgid "Give us your feedback!" msgstr "" -#: templates/feedback.html:17 +#: forum/skins/default/templates/feedback.html:17 #, python-format msgid "" "\n" @@ -1626,7 +1515,7 @@ msgid "" " " msgstr "" -#: templates/feedback.html:24 +#: forum/skins/default/templates/feedback.html:24 msgid "" "\n" " <span class='big strong'>Dear visitor</span>, we look forward to " @@ -1635,246 +1524,284 @@ msgid "" " " msgstr "" -#: templates/feedback.html:41 +#: forum/skins/default/templates/feedback.html:41 msgid "(this field is required)" msgstr "" -#: templates/feedback.html:49 +#: forum/skins/default/templates/feedback.html:49 msgid "Send Feedback" msgstr "" -#: templates/feedback_email.txt:3 -#, python-format -msgid "" -"\n" -"Hello, this is a %(site_title)s forum feedback message\n" -msgstr "" - -#: templates/feedback_email.txt:9 -msgid "Sender is" -msgstr "" - -#: templates/feedback_email.txt:11 templates/feedback_email.txt.py:14 -msgid "email" -msgstr "" - -#: templates/feedback_email.txt:13 -msgid "anonymous" -msgstr "" - -#: templates/feedback_email.txt:19 -msgid "Message body:" -msgstr "" - -#: templates/footer.html:8 templates/header.html:13 templates/index.html:119 +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:13 +#: forum/skins/default/templates/index.html:120 msgid "about" msgstr "" -#: templates/footer.html:9 templates/header.html:14 templates/index.html:120 -#: templates/question_edit_tips.html:17 +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:14 +#: forum/skins/default/templates/index.html:121 +#: forum/skins/default/templates/question_edit_tips.html:17 msgid "faq" msgstr "" -#: templates/footer.html:10 +#: forum/skins/default/templates/footer.html:10 msgid "privacy policy" msgstr "" -#: templates/footer.html:19 +#: forum/skins/default/templates/footer.html:19 msgid "give feedback" msgstr "" -#: templates/header.html:9 +#: forum/skins/default/templates/header.html:9 msgid "logout" msgstr "" -#: templates/header.html:11 +#: forum/skins/default/templates/header.html:11 msgid "login" msgstr "" -#: templates/header.html:21 +#: forum/skins/default/templates/header.html:21 msgid "back to home page" msgstr "" -#: templates/header.html:29 templates/header.html.py:57 +#: forum/skins/default/templates/header.html:29 +#: forum/skins/default/templates/header.html:57 msgid "users" msgstr "" -#: templates/header.html:31 +#: forum/skins/default/templates/header.html:31 msgid "books" msgstr "" -#: templates/header.html:34 +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:165 forum/templatetags/extra_tags.py:194 +msgid "badges" +msgstr "" + +#: forum/skins/default/templates/header.html:34 msgid "unanswered questions" -msgstr "unanswered" +msgstr "" -#: templates/header.html:36 +#: forum/skins/default/templates/header.html:36 msgid "ask a question" msgstr "" -#: templates/header.html:51 +#: forum/skins/default/templates/header.html:51 msgid "search" msgstr "" -#: templates/index.html:8 +#: forum/skins/default/templates/index.html:8 msgid "Home" msgstr "" -#: templates/index.html:25 templates/questions.html:8 +#: forum/skins/default/templates/index.html:25 +#: forum/skins/default/templates/questions.html:9 +#: forum/skins/default/templates/questions.html:282 msgid "Questions" msgstr "" -#: templates/index.html:27 +#: forum/skins/default/templates/index.html:27 msgid "last updated questions" msgstr "" -#: templates/index.html:27 templates/questions.html:47 +#: forum/skins/default/templates/index.html:27 +#: forum/skins/default/templates/questions.html:52 +#: forum/skins/default/templates/questions.html:321 +#: templates/unanswered.html:21 msgid "newest" msgstr "" -#: templates/index.html:28 templates/questions.html:49 +#: forum/skins/default/templates/index.html:28 +#: forum/skins/default/templates/questions.html:53 +#: forum/skins/default/templates/questions.html:322 +msgid "most recently updated questions" +msgstr "" + +#: forum/skins/default/templates/index.html:28 +#: forum/skins/default/templates/questions.html:53 +#: forum/skins/default/templates/questions.html:322 +msgid "active" +msgstr "" + +#: forum/skins/default/templates/index.html:29 +#: forum/skins/default/templates/questions.html:54 +#: forum/skins/default/templates/questions.html:323 msgid "hottest questions" msgstr "" -#: templates/index.html:28 templates/questions.html:49 +#: forum/skins/default/templates/index.html:29 +#: forum/skins/default/templates/questions.html:54 +#: forum/skins/default/templates/questions.html:323 msgid "hottest" msgstr "" -#: templates/index.html:29 templates/questions.html:50 +#: forum/skins/default/templates/index.html:30 +#: forum/skins/default/templates/questions.html:55 +#: forum/skins/default/templates/questions.html:324 msgid "most voted questions" msgstr "" -#: templates/index.html:29 templates/questions.html:50 +#: forum/skins/default/templates/index.html:30 +#: forum/skins/default/templates/questions.html:55 +#: forum/skins/default/templates/questions.html:324 msgid "most voted" msgstr "" -#: templates/index.html:30 +#: forum/skins/default/templates/index.html:31 msgid "all questions" msgstr "" -#: templates/index.html:48 templates/question_summary_list_roll.html:13 -#: templates/questions.html:79 templates/users_questions.html:36 +#: forum/skins/default/templates/index.html:49 +#: forum/skins/default/templates/question_summary_list_roll.html:13 +#: forum/skins/default/templates/questions.html:84 +#: forum/skins/default/templates/questions.html:353 +#: forum/skins/default/templates/users_questions.html:36 +#: templates/unanswered.html:38 msgid "answers" msgstr "" -#: templates/index.html:80 templates/index.html.py:94 -#: templates/questions.html:111 templates/questions.html.py:125 +#: forum/skins/default/templates/index.html:81 +#: forum/skins/default/templates/index.html:95 +#: forum/skins/default/templates/questions.html:116 +#: forum/skins/default/templates/questions.html:130 +#: forum/skins/default/templates/questions.html:385 +#: forum/skins/default/templates/questions.html:399 +#: templates/unanswered.html:70 templates/unanswered.html.py:84 msgid "Posted:" msgstr "" -#: templates/index.html:83 templates/index.html.py:88 -#: templates/questions.html:114 templates/questions.html.py:119 +#: forum/skins/default/templates/index.html:84 +#: forum/skins/default/templates/index.html:89 +#: forum/skins/default/templates/questions.html:119 +#: forum/skins/default/templates/questions.html:124 +#: forum/skins/default/templates/questions.html:388 +#: forum/skins/default/templates/questions.html:393 +#: templates/unanswered.html:73 templates/unanswered.html.py:78 msgid "Updated:" msgstr "" -#: templates/index.html:105 templates/question.html:480 -#: templates/question_summary_list_roll.html:52 templates/questions.html:136 -#: templates/tags.html:49 templates/users_questions.html:52 +#: forum/skins/default/templates/index.html:106 +#: forum/skins/default/templates/question.html:489 +#: forum/skins/default/templates/question.html:998 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/questions.html:141 +#: forum/skins/default/templates/questions.html:258 +#: forum/skins/default/templates/questions.html:410 +#: forum/skins/default/templates/tags.html:49 +#: forum/skins/default/templates/users_questions.html:52 +#: templates/unanswered.html:95 templates/unanswered.html.py:122 msgid "see questions tagged" msgstr "" -#: templates/index.html:116 +#: forum/skins/default/templates/index.html:117 msgid "welcome to website" -msgstr "Welcome to Q&A forum" +msgstr "" -#: templates/index.html:127 +#: forum/skins/default/templates/index.html:128 msgid "Recent tags" msgstr "" -#: templates/index.html:132 templates/question.html:135 +#: forum/skins/default/templates/index.html:133 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question.html:653 #, python-format msgid "see questions tagged '%(tagname)s'" msgstr "" -#: templates/index.html:135 templates/index.html.py:161 +#: forum/skins/default/templates/index.html:136 +#: forum/skins/default/templates/index.html:162 msgid "popular tags" -msgstr "tags" +msgstr "" -#: templates/index.html:140 +#: forum/skins/default/templates/index.html:141 msgid "Recent awards" -msgstr "Recent badges" +msgstr "" -#: templates/index.html:146 +#: forum/skins/default/templates/index.html:147 msgid "given to" msgstr "" -#: templates/index.html:151 +#: forum/skins/default/templates/index.html:152 msgid "all awards" -msgstr "all badges" +msgstr "" -#: templates/index.html:156 +#: forum/skins/default/templates/index.html:157 msgid "subscribe to last 30 questions by RSS" msgstr "" -#: templates/index.html:161 +#: forum/skins/default/templates/index.html:162 msgid "Still looking for more? See" msgstr "" -#: templates/index.html:161 +#: forum/skins/default/templates/index.html:162 msgid "complete list of questions" -msgstr "list of all questions" +msgstr "" -#: templates/index.html:161 templates/authopenid/signup.html:26 +#: forum/skins/default/templates/index.html:162 +#: forum/skins/default/templates/authopenid/signup.html:28 msgid "or" msgstr "" -#: templates/index.html:161 +#: forum/skins/default/templates/index.html:162 msgid "Please help us answer" msgstr "" -#: templates/index.html:161 +#: forum/skins/default/templates/index.html:162 msgid "list of unanswered questions" -msgstr "unanswered questions" +msgstr "" -#: templates/logout.html:6 templates/logout.html.py:16 +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 msgid "Logout" msgstr "" -#: templates/logout.html:19 +#: forum/skins/default/templates/logout.html:19 msgid "" "As a registered user you can login with your OpenID, log out of the site or " "permanently remove your account." msgstr "" -"Clicking <strong>Logout</strong> will log you out from the forumbut will not " -"sign you off from your OpenID provider.</p><p>If you wish to sign off " -"completely - please make sure to log out from your OpenID provider as well." -#: templates/logout.html:20 +#: forum/skins/default/templates/logout.html:20 msgid "Logout now" -msgstr "Logout Now" +msgstr "" -#: templates/notarobot.html:3 +#: forum/skins/default/templates/notarobot.html:3 msgid "Please prove that you are a Human Being" msgstr "" -#: templates/notarobot.html:10 +#: forum/skins/default/templates/notarobot.html:10 msgid "I am a Human Being" msgstr "" -#: templates/pagesize.html:6 +#: forum/skins/default/templates/pagesize.html:6 msgid "posts per page" msgstr "" -#: templates/paginator.html:6 templates/paginator.html.py:7 +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 msgid "previous" msgstr "" -#: templates/paginator.html:19 +#: forum/skins/default/templates/paginator.html:19 msgid "current page" msgstr "" -#: templates/paginator.html:22 templates/paginator.html.py:29 +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 msgid "page number " msgstr "" -#: templates/paginator.html:22 templates/paginator.html.py:29 +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 msgid "number - make blank in english" msgstr "" -#: templates/paginator.html:33 +#: forum/skins/default/templates/paginator.html:33 msgid "next page" msgstr "" -#: templates/post_contributor_info.html:9 +#: forum/skins/default/templates/post_contributor_info.html:9 #, python-format msgid "" "\n" @@ -1887,141 +1814,170 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/post_contributor_info.html:19 +#: forum/skins/default/templates/post_contributor_info.html:19 msgid "asked" msgstr "" -#: templates/post_contributor_info.html:22 +#: forum/skins/default/templates/post_contributor_info.html:22 msgid "answered" msgstr "" -#: templates/post_contributor_info.html:24 +#: forum/skins/default/templates/post_contributor_info.html:24 msgid "posted" msgstr "" -#: templates/post_contributor_info.html:45 +#: forum/skins/default/templates/post_contributor_info.html:45 msgid "updated" msgstr "" -#: templates/privacy.html:6 templates/privacy.html.py:11 +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 msgid "Privacy policy" msgstr "" -#: templates/privacy.html:15 +#: forum/skins/default/templates/privacy.html:15 msgid "general message about privacy" msgstr "" -"Respecting users privacy is an important core principle of this Q&A " -"forum. Information on this page details how this forum protects your " -"privacy, and what type of information is collected." -#: templates/privacy.html:18 +#: forum/skins/default/templates/privacy.html:18 msgid "Site Visitors" msgstr "" -#: templates/privacy.html:20 +#: forum/skins/default/templates/privacy.html:20 msgid "what technical information is collected about visitors" msgstr "" -"Information on question views, revisions of questions and answers - both " -"times and content are recorded for each user in order to correctly count " -"number of views, maintain data integrity and report relevant updates." -#: templates/privacy.html:23 +#: forum/skins/default/templates/privacy.html:23 msgid "Personal Information" msgstr "" -#: templates/privacy.html:25 +#: forum/skins/default/templates/privacy.html:25 msgid "details on personal information policies" msgstr "" -"Members of this community may choose to display personally identifiable " -"information in their profiles. Forum will never display such information " -"without a request from the user." -#: templates/privacy.html:28 +#: forum/skins/default/templates/privacy.html:28 msgid "Other Services" msgstr "" -#: templates/privacy.html:30 +#: forum/skins/default/templates/privacy.html:30 msgid "details on sharing data with third parties" msgstr "" -"None of the data that is not openly shown on the forum by the choice of the " -"user is shared with any third party." -#: templates/privacy.html:35 +#: forum/skins/default/templates/privacy.html:35 msgid "cookie policy details" msgstr "" -"Forum software relies on the internet cookie technology to keep track of " -"user sessions. Cookies must be enabled in your browser so that forum can " -"work for you." -#: templates/privacy.html:37 +#: forum/skins/default/templates/privacy.html:37 msgid "Policy Changes" msgstr "" -#: templates/privacy.html:38 +#: forum/skins/default/templates/privacy.html:38 msgid "how privacy policies can be changed" msgstr "" -"These policies may be adjusted to improve protection of user's privacy. " -"Whenever such changes occur, users will be notified via the internal " -"messaging system. " -#: templates/question.html:77 templates/question.html.py:78 -#: templates/question.html:94 templates/question.html.py:96 +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +#: forum/skins/default/templates/question.html:597 +#: forum/skins/default/templates/question.html:598 +#: forum/skins/default/templates/question.html:614 +#: forum/skins/default/templates/question.html:616 msgid "i like this post (click again to cancel)" msgstr "" -#: templates/question.html:80 templates/question.html.py:98 -#: templates/question.html:257 +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:258 +#: forum/skins/default/templates/question.html:600 +#: forum/skins/default/templates/question.html:618 +#: forum/skins/default/templates/question.html:775 msgid "current number of votes" msgstr "" -#: templates/question.html:89 templates/question.html.py:90 -#: templates/question.html:103 templates/question.html.py:104 +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +#: forum/skins/default/templates/question.html:609 +#: forum/skins/default/templates/question.html:610 +#: forum/skins/default/templates/question.html:623 +#: forum/skins/default/templates/question.html:624 msgid "i dont like this post (click again to cancel)" msgstr "" -#: templates/question.html:109 templates/question.html.py:110 +#: forum/skins/default/templates/question.html:110 +#: forum/skins/default/templates/question.html:111 +#: forum/skins/default/templates/question.html:628 +#: forum/skins/default/templates/question.html:629 msgid "mark this question as favorite (click again to cancel)" msgstr "" -#: templates/question.html:116 templates/question.html.py:117 +#: forum/skins/default/templates/question.html:117 +#: forum/skins/default/templates/question.html:118 +#: forum/skins/default/templates/question.html:635 +#: forum/skins/default/templates/question.html:636 msgid "remove favorite mark from this question (click again to restore mark)" msgstr "" -#: templates/question.html:140 templates/question.html.py:294 -#: templates/revisions_answer.html:58 templates/revisions_question.html:58 +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:295 +#: forum/skins/default/templates/question.html:658 +#: forum/skins/default/templates/question.html:812 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 msgid "edit" msgstr "" -#: templates/question.html:145 +#: forum/skins/default/templates/question.html:146 +#: forum/skins/default/templates/question.html:663 msgid "reopen" msgstr "" -#: templates/question.html:149 +#: forum/skins/default/templates/question.html:150 +#: forum/skins/default/templates/question.html:667 msgid "close" msgstr "" -#: templates/question.html:155 templates/question.html.py:299 +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:301 +#: forum/skins/default/templates/question.html:673 +#: forum/skins/default/templates/question.html:817 msgid "" "report as offensive (i.e containing spam, advertising, malicious text, etc.)" msgstr "" -#: templates/question.html:156 templates/question.html.py:300 +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:302 +#: forum/skins/default/templates/question.html:674 +#: forum/skins/default/templates/question.html:818 msgid "flag offensive" msgstr "" -#: templates/question.html:164 templates/question.html.py:311 +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:313 +#: forum/skins/default/templates/question.html:682 +#: forum/skins/default/templates/question.html:829 msgid "delete" msgstr "" -#: templates/question.html:182 templates/question.html.py:331 +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:333 +#: forum/skins/default/templates/question.html:700 +#: forum/skins/default/templates/question.html:849 msgid "delete this comment" msgstr "" -#: templates/question.html:193 templates/question.html.py:342 +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:344 +#: forum/skins/default/templates/question.html:368 +#: forum/skins/default/templates/question.html:711 +#: forum/skins/default/templates/question.html:860 msgid "add comment" -msgstr "post a comment" +msgstr "" -#: templates/question.html:197 +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:715 #, python-format msgid "" "\n" @@ -2035,7 +1991,8 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/question.html:203 +#: forum/skins/default/templates/question.html:204 +#: forum/skins/default/templates/question.html:721 #, python-format msgid "" "\n" @@ -2050,18 +2007,21 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/question.html:219 +#: forum/skins/default/templates/question.html:220 +#: forum/skins/default/templates/question.html:737 #, python-format msgid "" "The question has been closed for the following reason \"%(close_reason)s\" by" msgstr "" -#: templates/question.html:221 +#: forum/skins/default/templates/question.html:222 +#: forum/skins/default/templates/question.html:739 #, python-format msgid "close date %(closed_at)s" msgstr "" -#: templates/question.html:229 +#: forum/skins/default/templates/question.html:230 +#: forum/skins/default/templates/question.html:747 #, python-format msgid "" "\n" @@ -2074,59 +2034,81 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/question.html:237 +#: forum/skins/default/templates/question.html:238 +#: forum/skins/default/templates/question.html:755 msgid "oldest answers will be shown first" msgstr "" -#: templates/question.html:237 +#: forum/skins/default/templates/question.html:238 +#: forum/skins/default/templates/question.html:755 msgid "oldest answers" -msgstr "oldest" +msgstr "" -#: templates/question.html:239 +#: forum/skins/default/templates/question.html:240 +#: forum/skins/default/templates/question.html:757 msgid "newest answers will be shown first" msgstr "" -#: templates/question.html:239 +#: forum/skins/default/templates/question.html:240 +#: forum/skins/default/templates/question.html:757 msgid "newest answers" -msgstr "newest" +msgstr "" -#: templates/question.html:241 +#: forum/skins/default/templates/question.html:242 +#: forum/skins/default/templates/question.html:759 msgid "most voted answers will be shown first" msgstr "" -#: templates/question.html:241 +#: forum/skins/default/templates/question.html:242 +#: forum/skins/default/templates/question.html:759 msgid "popular answers" -msgstr "most voted" +msgstr "" -#: templates/question.html:255 templates/question.html.py:256 +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +#: forum/skins/default/templates/question.html:773 +#: forum/skins/default/templates/question.html:774 msgid "i like this answer (click again to cancel)" msgstr "" -#: templates/question.html:262 templates/question.html.py:263 +#: forum/skins/default/templates/question.html:263 +#: forum/skins/default/templates/question.html:264 +#: forum/skins/default/templates/question.html:780 +#: forum/skins/default/templates/question.html:781 msgid "i dont like this answer (click again to cancel)" msgstr "" -#: templates/question.html:268 templates/question.html.py:269 +#: forum/skins/default/templates/question.html:269 +#: forum/skins/default/templates/question.html:270 +#: forum/skins/default/templates/question.html:786 +#: forum/skins/default/templates/question.html:787 msgid "mark this answer as favorite (click again to undo)" msgstr "" -#: templates/question.html:274 templates/question.html.py:275 +#: forum/skins/default/templates/question.html:275 +#: forum/skins/default/templates/question.html:276 +#: forum/skins/default/templates/question.html:792 +#: forum/skins/default/templates/question.html:793 msgid "the author of the question has selected this answer as correct" msgstr "" -#: templates/question.html:288 +#: forum/skins/default/templates/question.html:289 +#: forum/skins/default/templates/question.html:806 msgid "answer permanent link" msgstr "" -#: templates/question.html:289 +#: forum/skins/default/templates/question.html:290 +#: forum/skins/default/templates/question.html:807 msgid "permanent link" -msgstr "link" +msgstr "" -#: templates/question.html:311 +#: forum/skins/default/templates/question.html:313 +#: forum/skins/default/templates/question.html:829 msgid "undelete" msgstr "" -#: templates/question.html:346 +#: forum/skins/default/templates/question.html:348 +#: forum/skins/default/templates/question.html:864 #, python-format msgid "" "\n" @@ -2141,7 +2123,8 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/question.html:352 +#: forum/skins/default/templates/question.html:354 +#: forum/skins/default/templates/question.html:870 #, python-format msgid "" "\n" @@ -2156,18 +2139,24 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/question.html:378 templates/question.html.py:381 +#: forum/skins/default/templates/question.html:367 +msgid "comments" +msgstr "" + +#: forum/skins/default/templates/question.html:387 +#: forum/skins/default/templates/question.html:390 +#: forum/skins/default/templates/question.html:896 +#: forum/skins/default/templates/question.html:899 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" -#: templates/question.html:384 +#: forum/skins/default/templates/question.html:393 +#: forum/skins/default/templates/question.html:902 msgid "Notify me weekly when there are any new answers" msgstr "" -"<strong>Notify me</strong> weekly when there are any new answers or updates" -#: templates/question.html:389 +#: forum/skins/default/templates/question.html:398 +#: forum/skins/default/templates/question.html:907 #, python-format msgid "" "\n" @@ -2175,170 +2164,215 @@ msgid "" "(profile_url)s\n" " " msgstr "" -"\n" -"(note: you can always <a href='%(profile_url)s?" -"sort=email_subscriptions'>adjust frequency</a> of email updates)" -#: templates/question.html:396 +#: forum/skins/default/templates/question.html:405 +#: forum/skins/default/templates/question.html:914 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." -#: templates/question.html:407 +#: forum/skins/default/templates/question.html:416 +#: forum/skins/default/templates/question.html:925 msgid "Your answer" msgstr "" -#: templates/question.html:409 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question.html:927 msgid "Be the first one to answer this question!" msgstr "" -#: templates/question.html:415 +#: forum/skins/default/templates/question.html:424 +#: forum/skins/default/templates/question.html:933 msgid "you can answer anonymously and then login" msgstr "" -"<span class='strong big'>Please start posting your answer anonymously</span> " -"- your answer will be saved within the current session and published after " -"you log in or create a new account. Please try to give a <strong>substantial " -"answer</strong>, for discussions, <strong>please use comments</strong> and " -"<strong>please do remember to vote</strong> (after you log in)!" -#: templates/question.html:419 +#: forum/skins/default/templates/question.html:428 +#: forum/skins/default/templates/question.html:937 msgid "answer your own question only to give an answer" msgstr "" -"<span class='big strong'>You are welcome to answer your own question</span>, " -"but please make sure to give an <strong>answer</strong>. Remember that you " -"can always <strong>revise your original question</strong>. Please " -"<strong>use comments for discussions</strong> and <strong>please don't " -"forget to vote :)</strong> for the answers that you liked (or perhaps did " -"not like)! " -#: templates/question.html:421 +#: forum/skins/default/templates/question.html:430 +#: forum/skins/default/templates/question.html:939 msgid "please only give an answer, no discussions" msgstr "" -"<span class='big strong'>Please try to give a substantial answer</span>. If " -"you wanted to comment on the question or answer, just <strong>use the " -"commenting tool</strong>. Please remember that you can always <strong>revise " -"your answers</strong> - no need to answer the same question twice. Also, " -"please <strong>don't forget to vote</strong> - it really helps to select the " -"best questions and answers!" -#: templates/question.html:457 +#: forum/skins/default/templates/question.html:466 +#: forum/skins/default/templates/question.html:975 msgid "Login/Signup to Post Your Answer" msgstr "" -#: templates/question.html:460 +#: forum/skins/default/templates/question.html:469 +#: forum/skins/default/templates/question.html:978 msgid "Answer Your Own Question" msgstr "" -#: templates/question.html:462 +#: forum/skins/default/templates/question.html:471 +#: forum/skins/default/templates/question.html:980 msgid "Answer the question" -msgstr "Post Your Answer" +msgstr "" -#: templates/question.html:475 +#: forum/skins/default/templates/question.html:484 +#: forum/skins/default/templates/question.html:993 msgid "Question tags" -msgstr "Tags" +msgstr "" -#: templates/question.html:485 +#: forum/skins/default/templates/question.html:494 +#: forum/skins/default/templates/question.html:1003 msgid "question asked" -msgstr "Asked" +msgstr "" -#: templates/question.html:488 +#: forum/skins/default/templates/question.html:497 +#: forum/skins/default/templates/question.html:1006 msgid "question was seen" -msgstr "Seen" +msgstr "" -#: templates/question.html:488 +#: forum/skins/default/templates/question.html:497 +#: forum/skins/default/templates/question.html:1006 msgid "times" msgstr "" -#: templates/question.html:491 +#: forum/skins/default/templates/question.html:500 +#: forum/skins/default/templates/question.html:1009 msgid "last updated" -msgstr "Last updated" +msgstr "" -#: templates/question.html:496 +#: forum/skins/default/templates/question.html:505 +#: forum/skins/default/templates/question.html:1014 msgid "Related questions" msgstr "" -#: templates/question_edit.html:5 templates/question_edit.html.py:66 +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 msgid "Edit question" msgstr "" -#: templates/question_edit_tips.html:4 +#: forum/skins/default/templates/question_edit_tips.html:4 msgid "question tips" -msgstr "Tips" +msgstr "" -#: templates/question_edit_tips.html:7 +#: forum/skins/default/templates/question_edit_tips.html:7 msgid "please ask a relevant question" -msgstr "ask a question relevant to the CNPROG community" +msgstr "" -#: templates/question_edit_tips.html:10 +#: forum/skins/default/templates/question_edit_tips.html:10 msgid "please try provide enough details" -msgstr "provide enough details" +msgstr "" -#: templates/question_retag.html:4 templates/question_retag.html.py:53 +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 msgid "Change tags" msgstr "" -#: templates/question_retag.html:40 +#: forum/skins/default/templates/question_retag.html:40 msgid "up to 5 tags, less than 20 characters each" msgstr "" -#: templates/question_retag.html:83 +#: forum/skins/default/templates/question_retag.html:83 msgid "Why use and modify tags?" msgstr "" -#: templates/question_retag.html:86 +#: forum/skins/default/templates/question_retag.html:86 msgid "tags help us keep Questions organized" msgstr "" -#: templates/question_retag.html:94 +#: forum/skins/default/templates/question_retag.html:94 msgid "tag editors receive special awards from the community" msgstr "" -#: templates/questions.html:29 +#: forum/skins/default/templates/questions.html:29 +#: forum/skins/default/templates/questions.html:33 +#: forum/skins/default/templates/questions.html:303 msgid "Found by tags" -msgstr "Tagged questions" - -#: templates/questions.html:33 -msgid "Search results" msgstr "" -#: templates/questions.html:35 +#: forum/skins/default/templates/questions.html:29 +#: forum/skins/default/templates/questions.html:39 +#: forum/skins/default/templates/questions.html:309 msgid "Found by title" msgstr "" -#: templates/questions.html:39 -msgid "Unanswered questions" +#: forum/skins/default/templates/questions.html:29 +#: forum/skins/default/templates/questions.html:45 +#: forum/skins/default/templates/questions.html:315 +msgid "All questions" msgstr "" -#: templates/questions.html:41 -msgid "All questions" +#: forum/skins/default/templates/questions.html:37 +#: forum/skins/default/templates/questions.html:307 +msgid "Search results" msgstr "" -#: templates/questions.html:47 -msgid "most recently asked questions" +#: forum/skins/default/templates/questions.html:43 +#: forum/skins/default/templates/questions.html:313 +#: templates/unanswered.html:8 templates/unanswered.html.py:19 +msgid "Unanswered questions" msgstr "" -#: templates/questions.html:48 -msgid "most recently updated questions" +#: forum/skins/default/templates/questions.html:52 +#: forum/skins/default/templates/questions.html:321 +#: templates/unanswered.html:21 +msgid "most recently asked questions" msgstr "" -#: templates/questions.html:48 -msgid "active" +#: forum/skins/default/templates/questions.html:144 +msgid "Category: " msgstr "" -#: templates/questions.html:144 +#: forum/skins/default/templates/questions.html:150 +#: forum/skins/default/templates/questions.html:418 msgid "Did not find anything?" msgstr "" -#: templates/questions.html:147 +#: forum/skins/default/templates/questions.html:153 +#: forum/skins/default/templates/questions.html:421 msgid "Did not find what you were looking for?" msgstr "" -#: templates/questions.html:149 +#: forum/skins/default/templates/questions.html:155 +#: forum/skins/default/templates/questions.html:423 msgid "Please, post your question!" msgstr "" -#: templates/questions.html:163 +#: forum/skins/default/templates/questions.html:170 +#, python-format +msgid "" +"\n" +"\t\t\thave total %(q_num)s questions tagged %(tagname)s\n" +"\t\t\t" +msgid_plural "" +"\n" +"\t\t\thave total %(q_num)s questions tagged %(tagname)s\n" +"\t\t\t" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:177 +#, python-format +msgid "" +"\n" +"\t\t\t\thave total %(q_num)s questions containing %(searchtitle)s\n" +"\t\t\t\t" +msgid_plural "" +"\n" +"\t\t\t\thave total %(q_num)s questions containing %(searchtitle)s\n" +"\t\t\t\t" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:183 +#, python-format +msgid "" +"\n" +"\t\t\t\thave total %(q_num)s questions\n" +"\t\t\t\t" +msgid_plural "" +"\n" +"\t\t\t\thave total %(q_num)s questions\n" +"\t\t\t\t" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:192 +#: forum/skins/default/templates/questions.html:437 #, python-format msgid "" "\n" @@ -2349,15 +2383,10 @@ msgid_plural "" " have total %(q_num)s questions tagged %(tagname)s\n" " " msgstr[0] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>question tagged</p><p><span " -"class=\"tag\">%(tagname)s</span></p>" msgstr[1] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>questions tagged</p><div " -"class=\"tags\"><span class=\"tag\">%(tagname)s</span></div>" -#: templates/questions.html:171 +#: forum/skins/default/templates/questions.html:200 +#: forum/skins/default/templates/questions.html:445 #, python-format msgid "" "\n" @@ -2370,15 +2399,10 @@ msgid_plural "" "s in full text\n" " " msgstr[0] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>question containing " -"<strong><span class=\"darkred\">%(searchtitle)s</span></strong></p>" msgstr[1] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>questions containing " -"<strong><span class=\"darkred\">%(searchtitle)s</span></strong></p>" -#: templates/questions.html:177 +#: forum/skins/default/templates/questions.html:206 +#: forum/skins/default/templates/questions.html:451 #, python-format msgid "" "\n" @@ -2391,17 +2415,10 @@ msgid_plural "" "s\n" " " msgstr[0] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>question with title " -"containing <strong><span class=\"darkred\">%(searchtitle)s</span></strong></" -"p>" msgstr[1] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>questions with title " -"containing <strong><span class=\"darkred\">%(searchtitle)s</span></strong></" -"p>" -#: templates/questions.html:185 +#: forum/skins/default/templates/questions.html:214 +#: forum/skins/default/templates/questions.html:459 #, python-format msgid "" "\n" @@ -2412,15 +2429,10 @@ msgid_plural "" " have total %(q_num)s unanswered questions\n" " " msgstr[0] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>question without an " -"accepted answer</p>" msgstr[1] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>questions without an " -"accepted answer</p>" -#: templates/questions.html:191 +#: forum/skins/default/templates/questions.html:220 +#: forum/skins/default/templates/questions.html:465 #, python-format msgid "" "\n" @@ -2431,236 +2443,250 @@ msgid_plural "" " have total %(q_num)s questions\n" " " msgstr[0] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>question</p>" msgstr[1] "" -"\n" -"<div class=\"questions-count\">%(q_num)s</div><p>questions<p>" -#: templates/questions.html:201 +#: forum/skins/default/templates/questions.html:231 +#: forum/skins/default/templates/questions.html:475 msgid "latest questions info" -msgstr "<strong>Newest</strong> questions are shown first." +msgstr "" -#: templates/questions.html:205 +#: forum/skins/default/templates/questions.html:235 +#: forum/skins/default/templates/questions.html:479 msgid "Questions are sorted by the <strong>time of last update</strong>." msgstr "" -#: templates/questions.html:206 +#: forum/skins/default/templates/questions.html:236 +#: forum/skins/default/templates/questions.html:480 msgid "Most recently answered ones are shown first." -msgstr "<strong>Most recently answered</strong> questions are shown first." +msgstr "" -#: templates/questions.html:210 +#: forum/skins/default/templates/questions.html:240 +#: forum/skins/default/templates/questions.html:484 msgid "Questions sorted by <strong>number of responses</strong>." -msgstr "Questions sorted by the <strong>number of answers</strong>." +msgstr "" -#: templates/questions.html:211 +#: forum/skins/default/templates/questions.html:241 +#: forum/skins/default/templates/questions.html:485 msgid "Most answered questions are shown first." -msgstr " " +msgstr "" -#: templates/questions.html:215 +#: forum/skins/default/templates/questions.html:245 +#: forum/skins/default/templates/questions.html:489 msgid "Questions are sorted by the <strong>number of votes</strong>." msgstr "" -#: templates/questions.html:216 +#: forum/skins/default/templates/questions.html:246 +#: forum/skins/default/templates/questions.html:490 msgid "Most voted questions are shown first." msgstr "" -#: templates/questions.html:224 +#: forum/skins/default/templates/questions.html:254 +#: forum/skins/default/templates/questions.html:498 +#: templates/unanswered.html:118 msgid "Related tags" -msgstr "Tags" +msgstr "" -#: templates/questions.html:227 templates/tag_selector.html:10 -#: templates/tag_selector.html.py:27 +#: forum/skins/default/templates/questions.html:264 +#: forum/skins/default/templates/questions.html:501 +#: forum/skins/default/templates/tag_selector.html:10 +#: forum/skins/default/templates/tag_selector.html:27 #, python-format msgid "see questions tagged '%(tag_name)s'" msgstr "" -#: templates/reopen.html:6 templates/reopen.html.py:16 +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 msgid "Reopen question" msgstr "" -#: templates/reopen.html:19 +#: forum/skins/default/templates/reopen.html:19 msgid "Open the previously closed question" msgstr "" -#: templates/reopen.html:22 +#: forum/skins/default/templates/reopen.html:22 msgid "The question was closed for the following reason " msgstr "" -#: templates/reopen.html:22 +#: forum/skins/default/templates/reopen.html:22 msgid "reason - leave blank in english" msgstr "" -#: templates/reopen.html:22 +#: forum/skins/default/templates/reopen.html:22 msgid "on " msgstr "" -#: templates/reopen.html:22 +#: forum/skins/default/templates/reopen.html:22 msgid "date closed" msgstr "" -#: templates/reopen.html:29 +#: forum/skins/default/templates/reopen.html:29 msgid "Reopen this question" msgstr "" -#: templates/revisions_answer.html:7 templates/revisions_answer.html.py:38 -#: templates/revisions_question.html:8 templates/revisions_question.html:38 +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 msgid "Revision history" msgstr "" -#: templates/revisions_answer.html:50 templates/revisions_question.html:50 +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 msgid "click to hide/show revision" msgstr "" -#: templates/tag_selector.html:4 +#: forum/skins/default/templates/tag_selector.html:4 msgid "Interesting tags" msgstr "" -#: templates/tag_selector.html:14 +#: forum/skins/default/templates/tag_selector.html:14 #, python-format msgid "remove '%(tag_name)s' from the list of interesting tags" msgstr "" -#: templates/tag_selector.html:20 templates/tag_selector.html.py:37 +#: forum/skins/default/templates/tag_selector.html:20 +#: forum/skins/default/templates/tag_selector.html:37 msgid "Add" msgstr "" -#: templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:21 msgid "Ignored tags" msgstr "" -#: templates/tag_selector.html:31 +#: forum/skins/default/templates/tag_selector.html:31 #, python-format msgid "remove '%(tag_name)s' from the list of ignored tags" msgstr "" -#: templates/tag_selector.html:40 +#: forum/skins/default/templates/tag_selector.html:40 msgid "keep ingored questions hidden" msgstr "" -#: templates/tags.html:6 templates/tags.html.py:30 +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 msgid "Tag list" msgstr "" -#: templates/tags.html:32 +#: forum/skins/default/templates/tags.html:32 msgid "sorted alphabetically" msgstr "" -#: templates/tags.html:32 +#: forum/skins/default/templates/tags.html:32 msgid "by name" msgstr "" -#: templates/tags.html:33 +#: forum/skins/default/templates/tags.html:33 msgid "sorted by frequency of tag use" msgstr "" -#: templates/tags.html:33 +#: forum/skins/default/templates/tags.html:33 msgid "by popularity" msgstr "" -#: templates/tags.html:39 +#: forum/skins/default/templates/tags.html:39 msgid "All tags matching query" msgstr "" -#: templates/tags.html:39 +#: forum/skins/default/templates/tags.html:39 msgid "all tags - make this empty in english" msgstr "" -#: templates/tags.html:42 +#: forum/skins/default/templates/tags.html:42 msgid "Nothing found" msgstr "" -#: templates/user_edit.html:6 +#: forum/skins/default/templates/user_edit.html:6 msgid "Edit user profile" msgstr "" -#: templates/user_edit.html:19 +#: forum/skins/default/templates/user_edit.html:19 msgid "edit profile" msgstr "" -#: templates/user_edit.html:31 +#: forum/skins/default/templates/user_edit.html:31 msgid "image associated with your email address" msgstr "" -#: templates/user_edit.html:31 +#: forum/skins/default/templates/user_edit.html:31 #, python-format msgid "avatar, see %(gravatar_faq_url)s" -msgstr "<a href='%(gravatar_faq_url)s'>gravatar</a>" +msgstr "" -#: templates/user_edit.html:36 templates/user_info.html:56 +#: forum/skins/default/templates/user_edit.html:36 +#: forum/skins/default/templates/user_info.html:56 msgid "Registered user" msgstr "" -#: templates/user_edit.html:43 +#: forum/skins/default/templates/user_edit.html:43 msgid "Screen Name" msgstr "" -#: templates/user_edit.html:86 templates/user_email_subscriptions.html:20 +#: forum/skins/default/templates/user_edit.html:86 +#: forum/skins/default/templates/user_email_subscriptions.html:23 msgid "Update" msgstr "" -#: templates/user_email_subscriptions.html:8 +#: forum/skins/default/templates/user_email_subscriptions.html:8 msgid "Email subscription settings" msgstr "" -#: templates/user_email_subscriptions.html:9 +#: forum/skins/default/templates/user_email_subscriptions.html:9 msgid "email subscription settings info" msgstr "" -"<span class='big strong'>Adjust frequency of email updates.</span> Receive " -"updates on interesting questions by email, <strong><br/>help the community</" -"strong> by answering questions of your colleagues. If you do not wish to " -"receive emails - select 'no email' on all items below.<br/>Updates are only " -"sent when there is any new activity on selected items." -#: templates/user_email_subscriptions.html:21 +#: forum/skins/default/templates/user_email_subscriptions.html:24 msgid "Stop sending email" -msgstr "Stop Email" +msgstr "" -#: templates/user_info.html:32 +#: forum/skins/default/templates/user_info.html:22 +msgid "karma" +msgstr "" + +#: forum/skins/default/templates/user_info.html:32 msgid "Moderate this user" msgstr "" -#: templates/user_info.html:45 +#: forum/skins/default/templates/user_info.html:45 msgid "update profile" msgstr "" -#: templates/user_info.html:60 +#: forum/skins/default/templates/user_info.html:60 msgid "real name" msgstr "" -#: templates/user_info.html:65 +#: forum/skins/default/templates/user_info.html:65 msgid "member for" -msgstr "member since" +msgstr "" -#: templates/user_info.html:70 +#: forum/skins/default/templates/user_info.html:70 msgid "last seen" msgstr "" -#: templates/user_info.html:76 +#: forum/skins/default/templates/user_info.html:76 msgid "user website" msgstr "" -#: templates/user_info.html:82 +#: forum/skins/default/templates/user_info.html:82 msgid "location" msgstr "" -#: templates/user_info.html:89 +#: forum/skins/default/templates/user_info.html:89 msgid "age" msgstr "" -#: templates/user_info.html:90 +#: forum/skins/default/templates/user_info.html:90 msgid "age unit" -msgstr "years old" +msgstr "" -#: templates/user_info.html:96 +#: forum/skins/default/templates/user_info.html:96 msgid "todays unused votes" msgstr "" -#: templates/user_info.html:97 +#: forum/skins/default/templates/user_info.html:97 msgid "votes left" msgstr "" -#: templates/user_stats.html:12 +#: forum/skins/default/templates/user_stats.html:12 #, python-format msgid "" "\n" @@ -2673,7 +2699,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/user_stats.html:23 +#: forum/skins/default/templates/user_stats.html:23 #, python-format msgid "" "\n" @@ -2686,16 +2712,16 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/user_stats.html:36 +#: forum/skins/default/templates/user_stats.html:36 #, python-format msgid "the answer has been voted for %(vote_count)s times" msgstr "" -#: templates/user_stats.html:36 +#: forum/skins/default/templates/user_stats.html:36 msgid "this answer has been selected as correct" msgstr "" -#: templates/user_stats.html:46 +#: forum/skins/default/templates/user_stats.html:46 #, python-format msgid "" "\n" @@ -2706,13 +2732,9 @@ msgid_plural "" " the answer has been commented %(comment_count)s times\n" " " msgstr[0] "" -"\n" -"(one comment)" msgstr[1] "" -"\n" -"(%(comment_count)s comments)" -#: templates/user_stats.html:61 +#: forum/skins/default/templates/user_stats.html:61 #, python-format msgid "" "\n" @@ -2725,23 +2747,23 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/user_stats.html:72 +#: forum/skins/default/templates/user_stats.html:72 msgid "thumb up" msgstr "" -#: templates/user_stats.html:73 +#: forum/skins/default/templates/user_stats.html:73 msgid "user has voted up this many times" msgstr "" -#: templates/user_stats.html:77 +#: forum/skins/default/templates/user_stats.html:77 msgid "thumb down" msgstr "" -#: templates/user_stats.html:78 +#: forum/skins/default/templates/user_stats.html:78 msgid "user voted down this many times" msgstr "" -#: templates/user_stats.html:87 +#: forum/skins/default/templates/user_stats.html:87 #, python-format msgid "" "\n" @@ -2754,13 +2776,13 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/user_stats.html:100 +#: forum/skins/default/templates/user_stats.html:100 #, python-format msgid "" "see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " msgstr "" -#: templates/user_stats.html:115 +#: forum/skins/default/templates/user_stats.html:115 #, python-format msgid "" "\n" @@ -2773,236 +2795,233 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: templates/user_tabs.html:7 +#: forum/skins/default/templates/user_tabs.html:7 msgid "User profile" msgstr "" -#: templates/user_tabs.html:16 +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:875 +msgid "overview" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:883 +msgid "recent activity" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:893 +msgid "comments and answers to others questions" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:892 +msgid "responses" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:16 msgid "graph of user reputation" -msgstr "Graph of user karma" +msgstr "" -#: templates/user_tabs.html:17 +#: forum/skins/default/templates/user_tabs.html:17 msgid "reputation history" -msgstr "karma history" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:919 +msgid "user vote record" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:918 +msgid "casted votes" +msgstr "" -#: templates/user_tabs.html:23 +#: forum/skins/default/templates/user_tabs.html:23 msgid "questions that user selected as his/her favorite" msgstr "" -#: templates/user_tabs.html:24 +#: forum/skins/default/templates/user_tabs.html:24 msgid "favorites" msgstr "" -#: templates/users.html:6 templates/users.html.py:24 +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:928 +msgid "email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:927 +msgid "email subscriptions" +msgstr "" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 msgid "Users" msgstr "" -#: templates/users.html:27 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:901 +msgid "reputation" +msgstr "" + +#: forum/skins/default/templates/users.html:27 msgid "recent" msgstr "" -#: templates/users.html:28 +#: forum/skins/default/templates/users.html:28 msgid "oldest" msgstr "" -#: templates/users.html:29 +#: forum/skins/default/templates/users.html:29 msgid "by username" msgstr "" -#: templates/users.html:35 +#: forum/skins/default/templates/users.html:35 #, python-format msgid "users matching query %(suser)s:" msgstr "" -#: templates/users.html:39 +#: forum/skins/default/templates/users.html:39 msgid "Nothing found." msgstr "" -#: templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:11 msgid "this questions was selected as favorite" msgstr "" -#: templates/users_questions.html:12 +#: forum/skins/default/templates/users_questions.html:12 msgid "thumb-up on" msgstr "" -#: templates/users_questions.html:19 +#: forum/skins/default/templates/users_questions.html:19 msgid "thumb-up off" msgstr "" -#: templates/users_questions.html:34 +#: forum/skins/default/templates/users_questions.html:34 msgid "this answer has been accepted to be correct" msgstr "" -#: templates/authopenid/changeemail.html:3 -#: templates/authopenid/changeemail.html:9 -#: templates/authopenid/changeemail.html:38 +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 msgid "Change email" -msgstr "Change Email" +msgstr "" -#: templates/authopenid/changeemail.html:11 +#: forum/skins/default/templates/authopenid/changeemail.html:11 msgid "Save your email address" msgstr "" -#: templates/authopenid/changeemail.html:16 +#: forum/skins/default/templates/authopenid/changeemail.html:16 #, python-format msgid "change %(email)s info" msgstr "" -"<span class=\"strong big\">Enter your new email into the box below</span> if " -"you'd like to use another email for <strong>update subscriptions</strong>." -"<br>Currently you are using <strong>%(email)s</strong>" -#: templates/authopenid/changeemail.html:18 +#: forum/skins/default/templates/authopenid/changeemail.html:18 #, python-format msgid "here is why email is required, see %(gravatar_faq_url)s" msgstr "" -"<span class='strong big'>Please enter your email address in the box below.</" -"span> Valid email address is required on this Q&A forum. If you like, " -"you can <strong>receive updates</strong> on interesting questions or entire " -"forum via email. Also, your email is used to create a unique <a href='%" -"(gravatar_faq_url)s'><strong>gravatar</strong></a> image for your account. " -"Email addresses are never shown or otherwise shared with anybody else." -#: templates/authopenid/changeemail.html:31 +#: forum/skins/default/templates/authopenid/changeemail.html:31 msgid "Your new Email" msgstr "" -"<strong>Your new Email:</strong> (will <strong>not</strong> be shown to " -"anyone, must be valid)" -#: templates/authopenid/changeemail.html:31 +#: forum/skins/default/templates/authopenid/changeemail.html:31 msgid "Your Email" msgstr "" -"<strong>Your Email</strong> (<i>must be valid, never shown to others</i>)" -#: templates/authopenid/changeemail.html:38 +#: forum/skins/default/templates/authopenid/changeemail.html:38 msgid "Save Email" msgstr "" -#: templates/authopenid/changeemail.html:49 +#: forum/skins/default/templates/authopenid/changeemail.html:49 msgid "Validate email" msgstr "" -#: templates/authopenid/changeemail.html:52 +#: forum/skins/default/templates/authopenid/changeemail.html:52 #, python-format msgid "validate %(email)s info or go to %(change_email_url)s" msgstr "" -"<span class=\"strong big\">An email with a validation link has been sent to %" -"(email)s.</span> Please <strong>follow the emailed link</strong> with your " -"web browser. Email validation is necessary to help insure the proper use of " -"email on <span class=\"orange\">Q&A</span>. If you would like to use " -"<strong>another email</strong>, please <a href='%(change_email_url)" -"s'><strong>change it again</strong></a>." -#: templates/authopenid/changeemail.html:57 +#: forum/skins/default/templates/authopenid/changeemail.html:57 msgid "Email not changed" msgstr "" -#: templates/authopenid/changeemail.html:60 +#: forum/skins/default/templates/authopenid/changeemail.html:60 #, python-format msgid "old %(email)s kept, if you like go to %(change_email_url)s" msgstr "" -"<span class=\"strong big\">Your email address %(email)s has not been changed." -"</span> If you decide to change it later - you can always do it by editing " -"it in your user profile or by using the <a href='%(change_email_url)" -"s'><strong>previous form</strong></a> again." -#: templates/authopenid/changeemail.html:65 +#: forum/skins/default/templates/authopenid/changeemail.html:65 msgid "Email changed" msgstr "" -#: templates/authopenid/changeemail.html:68 +#: forum/skins/default/templates/authopenid/changeemail.html:68 #, python-format msgid "your current %(email)s can be used for this" msgstr "" -"<span class='big strong'>Your email address is now set to %(email)s.</span> " -"Updates on the questions that you like most will be sent to this address. " -"Email notifications are sent once a day or less frequently - only when there " -"are any news." -#: templates/authopenid/changeemail.html:73 +#: forum/skins/default/templates/authopenid/changeemail.html:73 msgid "Email verified" msgstr "" -#: templates/authopenid/changeemail.html:76 +#: forum/skins/default/templates/authopenid/changeemail.html:76 msgid "thanks for verifying email" msgstr "" -"<span class=\"big strong\">Thank you for verifying your email!</span> Now " -"you can <strong>ask</strong> and <strong>answer</strong> questions. Also if " -"you find a very interesting question you can <strong>subscribe for the " -"updates</strong> - then will be notified about changes <strong>once a day</" -"strong> or less frequently." -#: templates/authopenid/changeemail.html:81 +#: forum/skins/default/templates/authopenid/changeemail.html:81 msgid "email key not sent" -msgstr "Validation email not sent" +msgstr "" -#: templates/authopenid/changeemail.html:84 +#: forum/skins/default/templates/authopenid/changeemail.html:84 #, python-format msgid "email key not sent %(email)s change email here %(change_link)s" msgstr "" -"<span class='big strong'>Your current email address %(email)s has been " -"validated before</span> so the new key was not sent. You can <a href='%" -"(change_link)s'>change</a> email used for update subscriptions if necessary." -#: templates/authopenid/changeopenid.html:4 -#: templates/authopenid/changeopenid.html:30 -#: templates/authopenid/settings.html:34 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 msgid "Change OpenID" msgstr "" -#: templates/authopenid/changeopenid.html:8 +#: forum/skins/default/templates/authopenid/changeopenid.html:8 msgid "Account: change OpenID URL" msgstr "" -#: templates/authopenid/changeopenid.html:12 +#: forum/skins/default/templates/authopenid/changeopenid.html:12 msgid "" "This is where you can change your OpenID URL. Make sure you remember it!" msgstr "" -#: templates/authopenid/changeopenid.html:14 -#: templates/authopenid/delete.html:14 templates/authopenid/delete.html:24 +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 msgid "Please correct errors below:" msgstr "" -#: templates/authopenid/changeopenid.html:29 +#: forum/skins/default/templates/authopenid/changeopenid.html:29 msgid "OpenID URL:" msgstr "" -#: templates/authopenid/changepw.html:5 templates/authopenid/changepw.html:14 -#: templates/authopenid/settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 msgid "Change password" msgstr "" -#: templates/authopenid/changepw.html:7 +#: forum/skins/default/templates/authopenid/changepw.html:7 msgid "Account: change password" -msgstr "Change your password" +msgstr "" -#: templates/authopenid/changepw.html:8 +#: forum/skins/default/templates/authopenid/changepw.html:8 msgid "This is where you can change your password. Make sure you remember it!" msgstr "" -"<span class='strong'>To change your password</span> please fill out and " -"submit this form" -#: templates/authopenid/complete.html:19 +#: forum/skins/default/templates/authopenid/complete.html:19 msgid "Connect your OpenID with this site" -msgstr "New user signup" +msgstr "" -#: templates/authopenid/complete.html:22 +#: forum/skins/default/templates/authopenid/complete.html:22 msgid "Connect your OpenID with your account on this site" -msgstr "New user signup" +msgstr "" -#: templates/authopenid/complete.html:27 +#: forum/skins/default/templates/authopenid/complete.html:27 #, python-format msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" msgstr "" -"<p><span class=\"big strong\">You are here for the first time with your %" -"(provider)s login.</span> Please create your <strong>screen name</strong> " -"and save your <strong>email</strong> address. Saved email address will let " -"you <strong>subscribe for the updates</strong> on the most interesting " -"questions and will be used to create and retrieve your unique avatar image - " -"<a href='%(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>" -#: templates/authopenid/complete.html:31 +#: forum/skins/default/templates/authopenid/complete.html:31 #, python-format msgid "" "%(username)s already exists, choose another name for \n" @@ -3010,260 +3029,172 @@ msgid "" "(gravatar_faq_url)s\n" " " msgstr "" -"<p><span class='strong big'>Oops... looks like screen name %(username)s is " -"already used in another account.</span></p><p>Please choose another screen " -"name to use with your %(provider)s login. Also, a valid email address is " -"required on the <span class='orange'>Q&A</span> forum. Your email is " -"used to create a unique <a href='%(gravatar_faq_url)s'><strong>gravatar</" -"strong></a> image for your account. If you like, you can <strong>receive " -"updates</strong> on the interesting questions or entire forum by email. " -"Email addresses are never shown or otherwise shared with anybody else.</p>" -#: templates/authopenid/complete.html:35 +#: forum/skins/default/templates/authopenid/complete.html:35 #, python-format msgid "" "register new external %(provider)s account info, see %(gravatar_faq_url)s" msgstr "" -"<p><span class=\"big strong\">You are here for the first time with your %" -"(provider)s login.</span></p><p>You can either keep your <strong>screen " -"name</strong> the same as your %(provider)s login name or choose some other " -"nickname.</p><p>Also, please save a valid <strong>email</strong> address. " -"With the email you can <strong>subscribe for the updates</strong> on the " -"most interesting questions. Email address is also used to create and " -"retrieve your unique avatar image - <a href='%(gravatar_faq_url)" -"s'><strong>gravatar</strong></a>.</p>" -#: templates/authopenid/complete.html:38 +#: forum/skins/default/templates/authopenid/complete.html:38 #, python-format msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" msgstr "" -"<p><span class=\"big strong\">You are here for the first time with your " -"Facebook login.</span> Please create your <strong>screen name</strong> " -"and save your <strong>email</strong> address. Saved email address will let " -"you <strong>subscribe for the updates</strong> on the most interesting " -"questions and will be used to create and retrieve your unique avatar image - " -"<a href='%(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>" -#: templates/authopenid/complete.html:42 +#: forum/skins/default/templates/authopenid/complete.html:42 msgid "This account already exists, please use another." msgstr "" -#: templates/authopenid/complete.html:57 +#: forum/skins/default/templates/authopenid/complete.html:57 msgid "Sorry, looks like we have some errors:" msgstr "" -#: templates/authopenid/complete.html:82 +#: forum/skins/default/templates/authopenid/complete.html:82 msgid "Screen name label" -msgstr "<strong>Screen Name</strong> (<i>will be shown to others</i>)" +msgstr "" -#: templates/authopenid/complete.html:89 +#: forum/skins/default/templates/authopenid/complete.html:89 msgid "Email address label" msgstr "" -"<strong>Email Address</strong> (<i>will <strong>not</strong> be shared with " -"anyone, must be valid</i>)" -#: templates/authopenid/complete.html:95 templates/authopenid/signup.html:18 +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:96 +#: forum/skins/default/templates/authopenid/signup.html:18 msgid "receive updates motivational blurb" msgstr "" -"<strong>Receive forum updates by email</strong> - this will help our " -"community grow and become more useful.<br/>By default <span " -"class='orange'>Q&A</span> forum sends up to <strong>one email digest per " -"week</strong> - only when there is anything new.<br/>If you like, please " -"adjust this now or any time later from your user account." -#: templates/authopenid/complete.html:99 -msgid "Tag filter tool will be your right panel, once you log in." +#: forum/skins/default/templates/authopenid/complete.html:100 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" msgstr "" -#: templates/authopenid/complete.html:100 +#: forum/skins/default/templates/authopenid/complete.html:104 msgid "create account" -msgstr "Signup" +msgstr "" -#: templates/authopenid/complete.html:109 +#: forum/skins/default/templates/authopenid/complete.html:113 msgid "Existing account" msgstr "" -#: templates/authopenid/complete.html:110 +#: forum/skins/default/templates/authopenid/complete.html:114 msgid "user name" msgstr "" -#: templates/authopenid/complete.html:111 +#: forum/skins/default/templates/authopenid/complete.html:115 msgid "password" msgstr "" -#: templates/authopenid/complete.html:118 +#: forum/skins/default/templates/authopenid/complete.html:122 msgid "Register" msgstr "" -#: templates/authopenid/complete.html:119 templates/authopenid/signin.html:151 +#: forum/skins/default/templates/authopenid/complete.html:123 +#: forum/skins/default/templates/authopenid/signin.html:151 msgid "Forgot your password?" msgstr "" -#: templates/authopenid/confirm_email.txt:2 -msgid "Thank you for registering at our Q&A forum!" -msgstr "" - -#: templates/authopenid/confirm_email.txt:4 -msgid "Your account details are:" -msgstr "" - -#: templates/authopenid/confirm_email.txt:6 -msgid "Username:" -msgstr "" - -#: templates/authopenid/confirm_email.txt:7 -#: templates/authopenid/delete.html:19 -msgid "Password:" -msgstr "" - -#: templates/authopenid/confirm_email.txt:9 -msgid "Please sign in here:" -msgstr "" - -#: templates/authopenid/confirm_email.txt:12 -#: templates/authopenid/email_validation.txt:14 -#: templates/authopenid/sendpw_email.txt:8 -msgid "" -"Sincerely,\n" -"Forum Administrator" -msgstr "" -"Sincerely,\n" -"Q&A Forum Administrator" - -#: templates/authopenid/delete.html:4 templates/authopenid/settings.html:38 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 msgid "Delete account" msgstr "" -#: templates/authopenid/delete.html:8 +#: forum/skins/default/templates/authopenid/delete.html:8 msgid "Account: delete account" msgstr "" -#: templates/authopenid/delete.html:12 +#: forum/skins/default/templates/authopenid/delete.html:12 msgid "" "Note: After deleting your account, anyone will be able to register this " "username." msgstr "" -#: templates/authopenid/delete.html:16 +#: forum/skins/default/templates/authopenid/delete.html:16 msgid "Check confirm box, if you want delete your account." msgstr "" -#: templates/authopenid/delete.html:31 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 msgid "I am sure I want to delete my account." msgstr "" -#: templates/authopenid/delete.html:32 +#: forum/skins/default/templates/authopenid/delete.html:32 msgid "Password/OpenID URL" msgstr "" -#: templates/authopenid/delete.html:32 +#: forum/skins/default/templates/authopenid/delete.html:32 msgid "(required for your security)" msgstr "" -#: templates/authopenid/delete.html:34 +#: forum/skins/default/templates/authopenid/delete.html:34 msgid "Delete account permanently" msgstr "" -#: templates/authopenid/email_validation.txt:2 -msgid "Greetings from the Q&A forum" -msgstr "" - -#: templates/authopenid/email_validation.txt:4 -msgid "To make use of the Forum, please follow the link below:" -msgstr "" - -#: templates/authopenid/email_validation.txt:8 -msgid "Following the link above will help us verify your email address." -msgstr "" - -#: templates/authopenid/email_validation.txt:10 -msgid "" -"If you beleive that this message was sent in mistake - \n" -"no further action is needed. Just ingore this email, we apologize\n" -"for any inconvenience" -msgstr "" - -#: templates/authopenid/external_legacy_login_info.html:4 -#: templates/authopenid/external_legacy_login_info.html:7 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 msgid "Traditional login information" msgstr "" -#: templates/authopenid/external_legacy_login_info.html:12 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 #, python-format msgid "" "how to login with password through external login website or use %" "(feedback_url)s" msgstr "" -#: templates/authopenid/sendpw.html:4 templates/authopenid/sendpw.html.py:7 +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 msgid "Send new password" -msgstr "Recover password" +msgstr "" -#: templates/authopenid/sendpw.html:10 +#: forum/skins/default/templates/authopenid/sendpw.html:10 msgid "password recovery information" msgstr "" -"<span class='big strong'>Forgot you password? No problems - just get a new " -"one!</span><br/>Please follow the following steps:<br/>• submit your " -"user name below and check your email<br/>• <strong>follow the " -"activation link</strong> for the new password - sent to you by email and " -"login with the suggested password<br/>• at this you might want to " -"change your password to something you can remember better" -#: templates/authopenid/sendpw.html:21 +#: forum/skins/default/templates/authopenid/sendpw.html:21 msgid "Reset password" -msgstr "Send me a new password" - -#: templates/authopenid/sendpw.html:22 -msgid "return to login" msgstr "" -#: templates/authopenid/sendpw_email.txt:2 -#, python-format -msgid "" -"Someone has requested to reset your password on %(site_url)s.\n" -"If it were not you, it is safe to ignore this email." -msgstr "" - -#: templates/authopenid/sendpw_email.txt:5 -#, python-format -msgid "" -"email explanation how to use new %(password)s for %(username)s\n" -"with the %(key_link)s" +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" msgstr "" -"To change your password, please follow these steps:\n" -"* visit this link: %(key_link)s\n" -"* 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" -#: templates/authopenid/settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 msgid "Account functions" msgstr "" -#: templates/authopenid/settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 msgid "Give your account a new password." msgstr "" -#: templates/authopenid/settings.html:31 +#: forum/skins/default/templates/authopenid/settings.html:31 msgid "Change email " msgstr "" -#: templates/authopenid/settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:32 msgid "Add or update the email address associated with your account." msgstr "" -#: templates/authopenid/settings.html:35 +#: forum/skins/default/templates/authopenid/settings.html:35 msgid "Change openid associated to your account" msgstr "" -#: templates/authopenid/settings.html:39 +#: forum/skins/default/templates/authopenid/settings.html:39 msgid "Erase your username and all your data from website" msgstr "" -#: templates/authopenid/signin.html:5 templates/authopenid/signin.html:21 +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 msgid "User login" -msgstr "User login" +msgstr "" -#: templates/authopenid/signin.html:28 +#: forum/skins/default/templates/authopenid/signin.html:28 #, python-format msgid "" "\n" @@ -3271,149 +3202,200 @@ msgid "" "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>" -#: templates/authopenid/signin.html:35 +#: forum/skins/default/templates/authopenid/signin.html:35 #, python-format msgid "" "Your question \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>" -#: templates/authopenid/signin.html:42 +#: forum/skins/default/templates/authopenid/signin.html:42 msgid "Click to sign in through any of these services." msgstr "" -"<p><span class=\"big strong\">Please select your favorite login method below." -"</span></p><p><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. CNPROG option requires your login name and " -"password entered here.</font></p>" -#: templates/authopenid/signin.html:128 +#: forum/skins/default/templates/authopenid/signin.html:128 msgid "Enter your <span id=\"enter_your_what\">Provider user name</span>" msgstr "" -"<span class=\"big strong\">Enter your </span><span id=\"enter_your_what\" " -"class='big strong'>Provider user name</span><br/><span class='grey'>(or " -"select another login method above)</span>" -#: templates/authopenid/signin.html:135 +#: forum/skins/default/templates/authopenid/signin.html:135 msgid "" "Enter your <a class=\"openid_logo\" href=\"http://openid.net\">OpenID</a> " "web address" msgstr "" -"<span class=\"big strong\">Enter your <a class=\"openid_logo\" href=\"http://" -"openid.net\">OpenID</a> web address</span><br/><span class='grey'>(or choose " -"another login method above)</span>" -#: templates/authopenid/signin.html:137 templates/authopenid/signin.html:149 +#: forum/skins/default/templates/authopenid/signin.html:137 +#: forum/skins/default/templates/authopenid/signin.html:149 msgid "Login" msgstr "" -#: templates/authopenid/signin.html:140 +#: forum/skins/default/templates/authopenid/signin.html:140 msgid "Enter your login name and password" msgstr "" -"<span class='big strong'>Enter your CNPROG login and password</span><br/" -"><span class='grey'>(or select your OpenID provider above)</span>" -#: templates/authopenid/signin.html:144 +#: forum/skins/default/templates/authopenid/signin.html:144 msgid "Login name" msgstr "" -#: templates/authopenid/signin.html:146 +#: forum/skins/default/templates/authopenid/signin.html:146 msgid "Password" msgstr "" -#: templates/authopenid/signin.html:150 +#: forum/skins/default/templates/authopenid/signin.html:150 msgid "Create account" msgstr "" -#: templates/authopenid/signin.html:160 +#: forum/skins/default/templates/authopenid/signin.html:160 msgid "Why use OpenID?" msgstr "" -#: templates/authopenid/signin.html:163 +#: forum/skins/default/templates/authopenid/signin.html:163 msgid "with openid it is easier" -msgstr "With the OpenID you don't need to create new username and password." +msgstr "" -#: templates/authopenid/signin.html:166 +#: forum/skins/default/templates/authopenid/signin.html:166 msgid "reuse openid" -msgstr "You can safely re-use the same login for all OpenID-enabled websites." +msgstr "" -#: templates/authopenid/signin.html:169 +#: forum/skins/default/templates/authopenid/signin.html:169 msgid "openid is widely adopted" msgstr "" -"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" -"enabled." -#: templates/authopenid/signin.html:172 +#: forum/skins/default/templates/authopenid/signin.html:172 msgid "openid is supported open standard" -msgstr "OpenID is based on an open standard, supported by many organizations." +msgstr "" -#: templates/authopenid/signin.html:177 +#: forum/skins/default/templates/authopenid/signin.html:177 msgid "Find out more" msgstr "" -#: templates/authopenid/signin.html:178 +#: forum/skins/default/templates/authopenid/signin.html:178 msgid "Get OpenID" msgstr "" -#: templates/authopenid/signup.html:4 +#: forum/skins/default/templates/authopenid/signup.html:4 msgid "Signup" msgstr "" -#: templates/authopenid/signup.html:8 +#: forum/skins/default/templates/authopenid/signup.html:8 msgid "Create login name and password" msgstr "" -#: templates/authopenid/signup.html:10 +#: forum/skins/default/templates/authopenid/signup.html:10 msgid "Traditional signup info" msgstr "" -"<span class='strong big'>If you prefer, create your forum login name and " -"password here. However</span>, please keep in mind that we also support " -"<strong>OpenID</strong> login method. With <strong>OpenID</strong> you can " -"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " -"your login details with anyone and having to remember yet another password." -#: templates/authopenid/signup.html:19 -msgid "" -"Please select your preferred email update schedule for the following groups " -"of questions:" -msgstr "" - -#: templates/authopenid/signup.html:23 +#: forum/skins/default/templates/authopenid/signup.html:25 msgid "" "Please read and type in the two words below to help us prevent automated " "account creation." msgstr "" -#: templates/authopenid/signup.html:25 +#: forum/skins/default/templates/authopenid/signup.html:27 msgid "Create Account" msgstr "" -#: templates/authopenid/signup.html:27 +#: forum/skins/default/templates/authopenid/signup.html:29 msgid "return to OpenID login" msgstr "" -#: templates/fbconnect/xd_receiver.html:5 +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 #, python-format msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" msgstr "" +#: forum/templatetags/extra_tags.py:166 forum/templatetags/extra_tags.py:193 +msgid "reputation points" +msgstr "" + +#: forum/templatetags/extra_tags.py:253 +msgid "2 days ago" +msgstr "" + +#: forum/templatetags/extra_tags.py:255 +msgid "yesterday" +msgstr "" + +#: forum/templatetags/extra_tags.py:257 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:259 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/views/users.py:876 +msgid "user profile" +msgstr "" + +#: forum/views/users.py:877 +msgid "user profile overview" +msgstr "" + +#: forum/views/users.py:884 +msgid "recent user activity" +msgstr "" + +#: forum/views/users.py:885 +msgid "profile - recent activity" +msgstr "" + +#: forum/views/users.py:894 +msgid "profile - responses" +msgstr "" + +#: forum/views/users.py:902 +msgid "user reputation in the community" +msgstr "" + +#: forum/views/users.py:903 +msgid "profile - user reputation" +msgstr "" + +#: forum/views/users.py:909 +msgid "favorite questions" +msgstr "" + +#: forum/views/users.py:910 +msgid "users favorite questions" +msgstr "" + +#: forum/views/users.py:911 +msgid "profile - favorite questions" +msgstr "" + +#: forum/views/users.py:920 +msgid "profile - votes" +msgstr "" + +#: forum/views/users.py:929 +msgid "profile - email subscriptions" +msgstr "" + +#: middleware/anon_user.py:33 +#, python-format +msgid "first time greeting with %(url)s" +msgstr "" + +#: templates/unanswered.html:114 +#, python-format +msgid "have %(num_q)s unanswered questions" +msgstr "" + #: utils/forms.py:27 msgid "this field is required" msgstr "" #: utils/forms.py:42 msgid "choose a username" -msgstr "Choose screen name" +msgstr "" #: utils/forms.py:47 msgid "user name is required" @@ -3441,7 +3423,7 @@ msgstr "" #: utils/forms.py:100 msgid "your email address" -msgstr "Your email <i>(never shared)</i>" +msgstr "" #: utils/forms.py:101 msgid "email address is required" @@ -3457,7 +3439,7 @@ msgstr "" #: utils/forms.py:128 msgid "choose password" -msgstr "Password" +msgstr "" #: utils/forms.py:129 msgid "password is required" @@ -3465,7 +3447,7 @@ msgstr "" #: utils/forms.py:132 msgid "retype password" -msgstr "Password <i>(please retype)</i>" +msgstr "" #: utils/forms.py:133 msgid "please, retype your password" @@ -3474,23 +3456,3 @@ msgstr "" #: utils/forms.py:134 msgid "sorry, entered passwords did not match, please try again" msgstr "" - -#~ msgid "have %(num_q)s unanswered questions" -#~ msgstr "" -#~ "<div class=\"questions-count\">%(num_q)s</div>questions <strong>without " -#~ "accepted answers</strong>" - -#~ msgid "" -#~ "\n" -#~ "\t\t\t\thave total %(q_num)s questions\n" -#~ "\t\t\t\t" -#~ msgid_plural "" -#~ "\n" -#~ "\t\t\t\thave total %(q_num)s questions\n" -#~ "\t\t\t\t" -#~ msgstr[0] "" -#~ "\n" -#~ "<div class=\"questions-count\">%(q_num)s</div><p>question</p>" -#~ msgstr[1] "" -#~ "\n" -#~ "<div class=\"questions-count\">%(q_num)s</div><p>questions</p>" diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo Binary files differindex fc7ebe14..2b514069 100644 --- a/locale/es/LC_MESSAGES/django.mo +++ b/locale/es/LC_MESSAGES/django.mo diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index b528fcf2..83ff69bf 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -1,1179 +1,1453 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-08-12 15:53+0000\n" -"PO-Revision-Date: \n" -"Last-Translator: Bruno Sarlo <bsarlo@gmail.com>\n" +"POT-Creation-Date: 2010-02-09 20:10+0000\n" +"PO-Revision-Date: 2010-02-09 14:11-0600\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: settings.py:12 urls.py:25 forum/views.py:304 forum/views.py:698 -msgid "account/" -msgstr "cuenta/" - -#: settings.py:12 urls.py:26 django_authopenid/urls.py:9 -#: django_authopenid/urls.py:10 django_authopenid/urls.py:11 -#: django_authopenid/urls.py:13 forum/views.py:304 forum/views.py:699 -#: templates/authopenid/confirm_email.txt:10 -msgid "signin/" -msgstr "ingresar/" - -#: urls.py:22 -msgid "upfiles/" -msgstr "archivossubidos/" - -#: urls.py:27 urls.py:28 urls.py:29 django_authopenid/urls.py:26 -#: django_authopenid/urls.py:27 -msgid "email/" -msgstr "email/" - -#: urls.py:27 -msgid "change/" -msgstr "cambiar/" - -#: urls.py:28 -msgid "sendkey/" -msgstr "enviarclave/" - -#: urls.py:29 -msgid "verify/" -msgstr "verificar/" - -#: urls.py:30 -msgid "about/" -msgstr "acercadenosotros/" - -#: urls.py:31 -msgid "faq/" -msgstr "preguntasfrecuentes/" - -#: urls.py:32 -msgid "privacy/" -msgstr "códigodeprivacidad/" - -#: urls.py:33 -msgid "logout/" -msgstr "cerrarsesion/" - -#: urls.py:34 urls.py:35 urls.py:36 urls.py:48 forum/models.py:418 -msgid "answers/" -msgstr "respuestas/" - -#: urls.py:34 urls.py:46 -msgid "comments/" -msgstr "comentarios/" - -#: urls.py:35 urls.py:40 urls.py:54 templates/user_info.html:34 -msgid "edit/" -msgstr "editar/" - -#: urls.py:36 urls.py:45 -msgid "revisions/" -msgstr "revisiones/" - -#: urls.py:37 urls.py:38 urls.py:39 urls.py:40 urls.py:41 urls.py:42 -#: urls.py:43 urls.py:44 urls.py:45 urls.py:46 urls.py:47 forum/feed.py:19 -#: forum/models.py:306 forum/views.py:1416 -msgid "questions/" -msgstr "preguntas/" - -#: urls.py:38 urls.py:64 -msgid "ask/" -msgstr "preguntar/" +#: django_authopenid/forms.py:70 +msgid "choose a username" +msgstr "" -#: urls.py:39 -msgid "unanswered/" -msgstr "sinrespuesta/" +#: django_authopenid/forms.py:76 +msgid "user name is required" +msgstr "" -#: urls.py:41 -msgid "close/" -msgstr "cerrar/" +#: django_authopenid/forms.py:77 +msgid "sorry, this name is taken, please choose another" +msgstr "" -#: urls.py:42 -msgid "reopen/" -msgstr "reabrir/" +#: django_authopenid/forms.py:78 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" -#: urls.py:43 -msgid "answer/" -msgstr "respuesta/" +#: django_authopenid/forms.py:79 +msgid "sorry, there is no user with this name" +msgstr "" -#: urls.py:44 -msgid "vote/" -msgstr "votar/" +#: django_authopenid/forms.py:80 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" -#: urls.py:47 urls.py:48 django_authopenid/urls.py:29 -msgid "delete/" -msgstr "borrar/" +#: django_authopenid/forms.py:81 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" -#: urls.py:50 -msgid "question/" -msgstr "pregunta/" +#: django_authopenid/forms.py:116 +msgid "your email address" +msgstr "" -#: urls.py:51 urls.py:52 forum/views.py:740 forum/views.py:2013 -msgid "tags/" -msgstr "etiquetas/" +#: django_authopenid/forms.py:117 +msgid "email address is required" +msgstr "" -#: urls.py:53 urls.py:54 urls.py:55 forum/views.py:993 forum/views.py:997 -#: forum/views.py:1418 forum/views.py:1751 forum/views.py:2015 -msgid "users/" -msgstr "usuarios/" +#: django_authopenid/forms.py:118 +msgid "please enter a valid email address" +msgstr "" -#: urls.py:56 urls.py:57 -msgid "badges/" -msgstr "distinciones/" +#: django_authopenid/forms.py:119 +msgid "this email is already used by someone else, please choose another" +msgstr "" -#: urls.py:58 -msgid "messages/" -msgstr "mensajes/" +#: django_authopenid/forms.py:163 django_authopenid/views.py:118 +msgid "i-names are not supported" +msgstr "" -#: urls.py:58 -msgid "markread/" -msgstr "marcarleido/" +#: django_authopenid/forms.py:219 +msgid "Account with this name already exists on the forum" +msgstr "" -#: urls.py:60 -msgid "nimda/" -msgstr "administrador/" +#: django_authopenid/forms.py:220 +msgid "can't have two logins to the same account yet, sorry." +msgstr "" -#: urls.py:62 -msgid "upload/" -msgstr "subir/" +#: django_authopenid/forms.py:242 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "" -#: urls.py:63 urls.py:64 urls.py:65 -msgid "books/" -msgstr "libros/" +#: django_authopenid/forms.py:245 django_authopenid/forms.py:295 +msgid "This account is inactive." +msgstr "" -#: urls.py:66 -msgid "search/" -msgstr "buscar/" +#: django_authopenid/forms.py:247 +msgid "Login failed." +msgstr "" -#: django_authopenid/forms.py:67 django_authopenid/views.py:102 -msgid "i-names are not supported" -msgstr "i-names no son soportados" +#: django_authopenid/forms.py:249 +msgid "Please enter username and password" +msgstr "" -#: django_authopenid/forms.py:102 -msgid "" -"Usernames can only contain letters, numbers and " -"underscores" +#: django_authopenid/forms.py:251 +msgid "Please enter your password" msgstr "" -"Los nombres de usuario solo pueden contener letras, números y guión bajo" -#: django_authopenid/forms.py:109 -msgid "" -"This username does not exist in our database. Please " -"choose another." +#: django_authopenid/forms.py:253 +msgid "Please enter user name" msgstr "" -"Este nombre de usuario no existe en nuestra base de datos. Por favor elija " -"otro." -#: django_authopenid/forms.py:126 django_authopenid/forms.py:233 +#: django_authopenid/forms.py:291 msgid "" "Please enter a valid username and password. Note that " "both fields are case-sensitive." msgstr "" -"Por favor ingrese un usuario y contraseña validos. Ambos campos son " -"sensibles a mayúsculas y minúsculas." -#: django_authopenid/forms.py:130 django_authopenid/forms.py:237 -msgid "This account is inactive." -msgstr "Esta cuenta esta inactiva." - -#: django_authopenid/forms.py:158 django_authopenid/forms.py:210 -msgid "invalid user name" -msgstr "nombre de usuario no valido" - -#: django_authopenid/forms.py:160 -msgid "sorry, this name can not be used, please try another" +#: django_authopenid/forms.py:313 +msgid "choose password" msgstr "" -"perdón, pero este nombre de usuario no puede ser usado, intente con otro" -#: django_authopenid/forms.py:162 -msgid "username too short" -msgstr "nombre de usuario muy corto" - -#: django_authopenid/forms.py:170 django_authopenid/forms.py:171 -msgid "this name is already in use - please try anoter" -msgstr "este nombre ya está tomado - por favor intente con otro" +#: django_authopenid/forms.py:314 +msgid "password is required" +msgstr "" -#: django_authopenid/forms.py:185 -msgid "" -"This email is already registered in our database. " -"Please choose another." +#: django_authopenid/forms.py:317 +msgid "retype password" msgstr "" -"Este email ya está registrado en nuestra base de datos. Por favor, intente " -"con otro." -#: django_authopenid/forms.py:216 -msgid "" -"This username don't exist. Please choose another." -msgstr "Este nombre de usuario no existe, por favor ingrese otro." +#: django_authopenid/forms.py:318 +msgid "please, retype your password" +msgstr "" -#: django_authopenid/forms.py:255 -msgid "choose a username" -msgstr "elija un nombre de usuario" +#: django_authopenid/forms.py:319 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" -#: django_authopenid/forms.py:257 templates/authopenid/signup.html:38 -msgid "your email address" -msgstr "su email (correo electrónico)" +#: django_authopenid/forms.py:344 +msgid "Current password" +msgstr "" -#: django_authopenid/forms.py:259 templates/authopenid/signup.html:39 -msgid "choose password" -msgstr "elija una contraseña" +#: django_authopenid/forms.py:346 +msgid "New password" +msgstr "" -#: django_authopenid/forms.py:261 templates/authopenid/signup.html:40 -msgid "retype password" -msgstr "re-ingrese la contraseña" +#: django_authopenid/forms.py:348 +msgid "Retype new password" +msgstr "" -#: django_authopenid/forms.py:335 +#: django_authopenid/forms.py:359 msgid "" "Old password is incorrect. Please enter the correct " "password." -msgstr "La antigua contraseña es incorrecta. Por favor ingrese la correcta" +msgstr "" -#: django_authopenid/forms.py:347 +#: django_authopenid/forms.py:371 msgid "new passwords do not match" -msgstr "la nueva contraseña no coincide" +msgstr "" -#: django_authopenid/forms.py:442 +#: django_authopenid/forms.py:435 +msgid "Your user name (<i>required</i>)" +msgstr "" + +#: django_authopenid/forms.py:450 msgid "Incorrect username." -msgstr "Nombre de usuario incorrecto" +msgstr "" -#: django_authopenid/urls.py:10 forum/views.py:304 forum/views.py:699 +#: django_authopenid/urls.py:9 django_authopenid/urls.py:10 +#: django_authopenid/urls.py:11 django_authopenid/urls.py:13 forum/urls.py:29 +msgid "signin/" +msgstr "" + +#: django_authopenid/urls.py:10 msgid "newquestion/" -msgstr "nuevapregunta/" +msgstr "" #: django_authopenid/urls.py:11 msgid "newanswer/" -msgstr "respuesta-nueva/" +msgstr "" #: django_authopenid/urls.py:12 msgid "signout/" -msgstr "salir/" +msgstr "" #: django_authopenid/urls.py:13 msgid "complete/" -msgstr "completado/" +msgstr "" #: django_authopenid/urls.py:15 -msgid "register/" -msgstr "registrarse/" +msgid "external-login/" +msgstr "" #: django_authopenid/urls.py:16 +msgid "register/" +msgstr "" + +#: django_authopenid/urls.py:17 msgid "signup/" -msgstr "registrarse/" +msgstr "" -#: django_authopenid/urls.py:18 +#: django_authopenid/urls.py:19 msgid "sendpw/" -msgstr "enviarcontrasena/" +msgstr "" -#: django_authopenid/urls.py:27 +#: django_authopenid/urls.py:20 django_authopenid/urls.py:24 +msgid "password/" +msgstr "" + +#: django_authopenid/urls.py:20 +msgid "confirm/" +msgstr "" + +#: django_authopenid/urls.py:23 +msgid "account_settings" +msgstr "" + +#: django_authopenid/urls.py:25 django_authopenid/urls.py:26 +#: django_authopenid/urls.py:27 django_authopenid/urls.py:28 +msgid "email/" +msgstr "" + +#: django_authopenid/urls.py:25 msgid "validate/" msgstr "" -#: django_authopenid/views.py:108 +#: django_authopenid/urls.py:26 +msgid "change/" +msgstr "" + +#: django_authopenid/urls.py:27 +msgid "sendkey/" +msgstr "" + +#: django_authopenid/urls.py:28 +msgid "verify/" +msgstr "" + +#: django_authopenid/urls.py:29 +msgid "openid/" +msgstr "" + +#: django_authopenid/urls.py:30 forum/urls.py:49 forum/urls.py:53 +msgid "delete/" +msgstr "" + +#: django_authopenid/views.py:124 #, python-format msgid "OpenID %(openid_url)s is invalid" -msgstr "El OpenID %(openid_url)s no es valido" +msgstr "" -#: django_authopenid/views.py:418 django_authopenid/views.py:545 -msgid "Welcome" -msgstr "Bienvenido" +#: django_authopenid/views.py:532 +msgid "Welcome email subject line" +msgstr "" -#: django_authopenid/views.py:508 +#: django_authopenid/views.py:627 msgid "Password changed." -msgstr "Contraseña modificada" +msgstr "" -#: django_authopenid/views.py:520 django_authopenid/views.py:525 -msgid "your email needs to be validated" -msgstr "su correo electrónico necesita ser validado" +#: django_authopenid/views.py:639 django_authopenid/views.py:645 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" + +#: django_authopenid/views.py:666 +msgid "Email verification subject line" +msgstr "" + +#: django_authopenid/views.py:752 +msgid "your email was not changed" +msgstr "" -#: django_authopenid/views.py:682 django_authopenid/views.py:834 +#: django_authopenid/views.py:799 django_authopenid/views.py:951 #, python-format msgid "No OpenID %s found associated in our database" -msgstr "El OpenID %s no esta asociada en nuestra base de datos" +msgstr "" -#: django_authopenid/views.py:686 django_authopenid/views.py:841 +#: django_authopenid/views.py:803 django_authopenid/views.py:958 #, python-format msgid "The OpenID %s isn't associated to current user logged in" -msgstr "El OpenID %s no esta asociada al usuario actualmente autenticado" +msgstr "" -#: django_authopenid/views.py:694 +#: django_authopenid/views.py:811 msgid "Email Changed." -msgstr "Email modificado" +msgstr "" -#: django_authopenid/views.py:769 +#: django_authopenid/views.py:886 msgid "This OpenID is already associated with another account." -msgstr "Este OpenID ya está asociada a otra cuenta." +msgstr "" -#: django_authopenid/views.py:774 +#: django_authopenid/views.py:891 #, python-format msgid "OpenID %s is now associated with your account." -msgstr "El OpenID %s está ahora asociada con tu cuenta." +msgstr "" -#: django_authopenid/views.py:844 +#: django_authopenid/views.py:961 msgid "Account deleted." -msgstr "Cuenta borrada." +msgstr "" -#: django_authopenid/views.py:884 +#: django_authopenid/views.py:1004 msgid "Request for new password" -msgstr "Pedir nueva contraseña" +msgstr "" -#: django_authopenid/views.py:897 -msgid "A new password has been sent to your email address." -msgstr "Una nueva contraseña ha sido enviada a tu cuenta de Email." +#: django_authopenid/views.py:1017 +msgid "A new password and the activation link were sent to your email address." +msgstr "" -#: django_authopenid/views.py:927 +#: django_authopenid/views.py:1047 #, python-format msgid "" "Could not change password. Confirmation key '%s' is not " "registered." msgstr "" -"No se ha podido modificar la contraseña. La clave de confirmación '%s' no " -"está registrada" -#: django_authopenid/views.py:936 +#: django_authopenid/views.py:1056 msgid "" "Can not change password. User don't exist anymore in our " "database." msgstr "" -"No se puede cambiar la contraseña. El usuario no existe más en nuestra base " -"de datos." -#: django_authopenid/views.py:945 +#: django_authopenid/views.py:1065 #, python-format msgid "Password changed for %s. You may now sign in." -msgstr "Contraseña cambiada por %s. Ahora puedes ingresar." +msgstr "" + +#: forum/auth.py:484 +msgid "Your question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:486 +msgid "Your question has been deleted" +msgstr "" + +#: forum/auth.py:489 +msgid "The question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:491 +msgid "The question has been deleted" +msgstr "" #: forum/const.py:8 msgid "duplicate question" -msgstr "pregunta duplicada" +msgstr "" #: forum/const.py:9 -msgid "question if off-topic or not relevant" -msgstr "pregunta esta fuera de tema o no es relevante" +msgid "question is off-topic or not relevant" +msgstr "" #: forum/const.py:10 msgid "too subjective and argumentative" -msgstr "demasiado subjetiva o argumentativa" +msgstr "" #: forum/const.py:11 msgid "is not an answer to the question" -msgstr "no es una respuesta a la pregunta" +msgstr "" #: forum/const.py:12 msgid "the question is answered, right answer was accepted" -msgstr "la pregunta esta respondida, se ha aceptado la respuesta correcta" +msgstr "" #: forum/const.py:13 msgid "problem is not reproducible or outdated" -msgstr "el problema no es reproducible o caducó" +msgstr "" #: forum/const.py:15 msgid "question contains offensive inappropriate, or malicious remarks" -msgstr "la pregunta contiene frases ofensivas, inapropiadas o maliciosas." +msgstr "" #: forum/const.py:16 msgid "spam or advertising" -msgstr "spam o publicidad" +msgstr "" -#: forum/const.py:56 +#: forum/const.py:57 msgid "question" -msgstr "pregunta" +msgstr "" -#: forum/const.py:57 templates/book.html:110 +#: forum/const.py:58 templates/book.html:110 msgid "answer" -msgstr "respuesta" +msgstr "" -#: forum/const.py:58 +#: forum/const.py:59 msgid "commented question" -msgstr "pregunta comentada" +msgstr "" -#: forum/const.py:59 +#: forum/const.py:60 msgid "commented answer" -msgstr "respuesta comentada" +msgstr "" -#: forum/const.py:60 +#: forum/const.py:61 msgid "edited question" -msgstr "pregunta editada" +msgstr "" -#: forum/const.py:61 +#: forum/const.py:62 msgid "edited answer" -msgstr "respuesta editada" +msgstr "" -#: forum/const.py:62 +#: forum/const.py:63 msgid "received award" -msgstr "premio recibido" +msgstr "" -#: forum/const.py:63 +#: forum/const.py:64 msgid "marked best answer" -msgstr "marcada como mejor respuesta" +msgstr "" -#: forum/const.py:64 +#: forum/const.py:65 msgid "upvoted" -msgstr "votada positivo" +msgstr "" -#: forum/const.py:65 +#: forum/const.py:66 msgid "downvoted" -msgstr "votada negativo" +msgstr "" -#: forum/const.py:66 +#: forum/const.py:67 msgid "canceled vote" -msgstr "voto cancelado" +msgstr "" -#: forum/const.py:67 +#: forum/const.py:68 msgid "deleted question" -msgstr "pregunta borrada" +msgstr "" -#: forum/const.py:68 +#: forum/const.py:69 msgid "deleted answer" -msgstr "respuesta borrada" +msgstr "" -#: forum/const.py:69 +#: forum/const.py:70 msgid "marked offensive" -msgstr "marcada como ofensiva" +msgstr "" -#: forum/const.py:70 +#: forum/const.py:71 msgid "updated tags" -msgstr "etiquetas actualizadas" +msgstr "" -#: forum/const.py:71 +#: forum/const.py:72 msgid "selected favorite" -msgstr "seleccionada como favorita" +msgstr "" -#: forum/const.py:72 +#: forum/const.py:73 msgid "completed user profile" -msgstr "completó perfil de usuario" +msgstr "" -#: forum/const.py:83 +#: forum/const.py:74 +msgid "email update sent to user" +msgstr "" + +#: forum/const.py:85 msgid "[closed]" -msgstr "[cerrada]" +msgstr "" -#: forum/const.py:84 +#: forum/const.py:86 msgid "[deleted]" -msgstr "[borrada]" +msgstr "" -#: forum/const.py:85 +#: forum/const.py:87 forum/views.py:777 forum/views.py:796 msgid "initial version" -msgstr "versión inicial" +msgstr "" -#: forum/const.py:86 +#: forum/const.py:88 msgid "retagged" -msgstr "re-etiquetada" +msgstr "" + +#: forum/const.py:92 +msgid "exclude ignored tags" +msgstr "" + +#: forum/const.py:92 +msgid "allow only selected tags" +msgstr "" #: forum/feed.py:18 msgid " - " -msgstr " - " +msgstr "" #: forum/feed.py:18 msgid "latest questions" -msgstr "últimas preguntas" +msgstr "" -#: forum/forms.py:14 templates/answer_edit_tips.html:33 -#: templates/answer_edit_tips.html.py:37 templates/question_edit_tips.html:31 -#: templates/question_edit_tips.html:36 +#: forum/feed.py:19 forum/urls.py:57 +msgid "question/" +msgstr "" + +#: forum/forms.py:16 templates/answer_edit_tips.html:35 +#: templates/answer_edit_tips.html.py:39 templates/question_edit_tips.html:32 +#: templates/question_edit_tips.html:37 msgid "title" -msgstr "título" +msgstr "" -#: forum/forms.py:15 +#: forum/forms.py:17 msgid "please enter a descriptive title for your question" -msgstr "ingrese un título descriptivo para su pregunta" +msgstr "" -#: forum/forms.py:20 +#: forum/forms.py:22 msgid "title must be > 10 characters" -msgstr "el título debe tener al menos 10 caracteres" +msgstr "" -#: forum/forms.py:29 +#: forum/forms.py:31 msgid "content" -msgstr "contenido" +msgstr "" -#: forum/forms.py:35 +#: forum/forms.py:37 msgid "question content must be > 10 characters" -msgstr "el contenido de la pregunta debe ser al menos de 10 caracteres" +msgstr "" -#: forum/forms.py:45 templates/header.html:30 templates/header.html.py:64 +#: forum/forms.py:47 templates/header.html:28 templates/header.html.py:62 msgid "tags" -msgstr "etiquetas" +msgstr "" -#: forum/forms.py:47 +#: forum/forms.py:49 msgid "" "Tags are short keywords, with no spaces within. Up to five tags can be used." msgstr "" -"por favor utilice espacio para separar las etiquetas (esto habilitael auto-" -"completado)" -#: forum/forms.py:54 templates/question_retag.html:38 +#: forum/forms.py:56 templates/question_retag.html:39 msgid "tags are required" -msgstr "las etiquetas son requeridas" +msgstr "" -#: forum/forms.py:58 +#: forum/forms.py:62 msgid "please use 5 tags or less" -msgstr "por favor use 5 o menos etiquetas" +msgstr "" -#: forum/forms.py:61 +#: forum/forms.py:65 msgid "tags must be shorter than 20 characters" -msgstr "las etiquetas deben ser menores a 20 caracteres" +msgstr "" -#: forum/forms.py:65 +#: forum/forms.py:69 msgid "" "please use following characters in tags: letters 'a-z', numbers, and " "characters '.-_#'" msgstr "" -"por favor use solo los siguientes caracteres en los nombres de etiquetas: " -"letras 'a-z', números y caracteres '.-_#'" -#: forum/forms.py:75 templates/index.html:57 templates/question.html:209 -#: templates/question.html.py:395 templates/questions.html:58 -#: templates/questions.html.py:70 templates/unanswered.html:48 -#: templates/unanswered.html.py:60 +#: forum/forms.py:79 templates/index.html:62 templates/index.html.py:74 +#: templates/post_contributor_info.html:7 +#: templates/question_summary_list_roll.html:26 +#: templates/question_summary_list_roll.html:38 templates/questions.html:96 +#: templates/questions.html.py:108 templates/unanswered.html:51 +#: templates/unanswered.html.py:63 msgid "community wiki" -msgstr "wiki de comunidad" +msgstr "" -#: forum/forms.py:76 +#: forum/forms.py:80 msgid "" "if you choose community wiki option, the question and answer do not generate " "points and name of author will not be shown" msgstr "" -"si marca la opción 'wiki de comunidad', la pregunta y respuestas no generan " -"puntos y el nombre del autor no será mostrado" -#: forum/forms.py:89 +#: forum/forms.py:96 msgid "update summary:" -msgstr "resumen de modificación" +msgstr "" -#: forum/forms.py:90 +#: forum/forms.py:97 msgid "" "enter a brief summary of your revision (e.g. fixed spelling, grammar, " "improved style, this field is optional)" msgstr "" -"ingresa un breve resumen de tu revisión (ej. error ortográfico, gramática, " -"mejoras de estilo. Este campo es opcional." -#: forum/forms.py:175 +#: forum/forms.py:100 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" + +#: forum/forms.py:113 +msgid "Your name:" +msgstr "" + +#: forum/forms.py:114 +msgid "Email (not shared with anyone):" +msgstr "" + +#: forum/forms.py:115 +msgid "Your message:" +msgstr "" + +#: forum/forms.py:198 msgid "this email does not have to be linked to gravatar" -msgstr "este email no tiene porque estar asociado a un Gravatar" +msgstr "" -#: forum/forms.py:176 +#: forum/forms.py:199 +msgid "Screen name" +msgstr "" + +#: forum/forms.py:200 msgid "Real name" -msgstr "Nombre real" +msgstr "" -#: forum/forms.py:177 +#: forum/forms.py:201 msgid "Website" -msgstr "Sitio Web" +msgstr "" -#: forum/forms.py:178 +#: forum/forms.py:202 msgid "Location" -msgstr "Ubicación" +msgstr "" -#: forum/forms.py:179 +#: forum/forms.py:203 msgid "Date of birth" -msgstr "Fecha de nacimiento" +msgstr "" -#: forum/forms.py:179 +#: forum/forms.py:203 msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" -msgstr "no será mostrado, usado para calcular la edad. Formato: YYY-MM-DD" +msgstr "" -#: forum/forms.py:180 templates/authopenid/settings.html:21 +#: forum/forms.py:204 templates/authopenid/settings.html:21 msgid "Profile" -msgstr "Perfil" +msgstr "" -#: forum/forms.py:207 forum/forms.py:208 +#: forum/forms.py:232 forum/forms.py:233 msgid "this email has already been registered, please use another one" -msgstr "este email ya ha sido registrado, por favor use otro" +msgstr "" + +#: forum/forms.py:239 +msgid "Choose email tag filter" +msgstr "" + +#: forum/forms.py:254 forum/forms.py:255 +msgid "weekly" +msgstr "" + +#: forum/forms.py:254 forum/forms.py:255 +msgid "no email" +msgstr "" + +#: forum/forms.py:255 +msgid "daily" +msgstr "" + +#: forum/forms.py:270 +msgid "Asked by me" +msgstr "" + +#: forum/forms.py:273 +msgid "Answered by me" +msgstr "" + +#: forum/forms.py:276 +msgid "Individually selected" +msgstr "" + +#: forum/forms.py:279 +msgid "Entire forum (tag filtered)" +msgstr "" + +#: forum/models.py:52 +msgid "Entire forum" +msgstr "" + +#: forum/models.py:53 +msgid "Questions that I asked" +msgstr "" + +#: forum/models.py:54 +msgid "Questions that I answered" +msgstr "" -#: forum/models.py:246 +#: forum/models.py:55 +msgid "Individually selected questions" +msgstr "" + +#: forum/models.py:58 +msgid "Weekly" +msgstr "" + +#: forum/models.py:59 +msgid "Daily" +msgstr "" + +#: forum/models.py:60 +msgid "No email" +msgstr "" + +#: forum/models.py:321 +#, python-format msgid "%(author)s modified the question" -msgstr "%(author)s modificó la pregunta" +msgstr "" -#: forum/models.py:250 +#: forum/models.py:325 #, python-format msgid "%(people)s posted %(new_answer_count)s new answers" -msgstr "%(people)s publicaron %(new_answer_count)s nuevas respuestas" +msgstr "" -#: forum/models.py:255 +#: forum/models.py:330 #, python-format msgid "%(people)s commented the question" -msgstr "%(people)s comentarion la pregunta" +msgstr "" -#: forum/models.py:260 +#: forum/models.py:335 #, python-format msgid "%(people)s commented answers" -msgstr "%(people)s comentaron la respuesta" +msgstr "" -#: forum/models.py:262 +#: forum/models.py:337 #, python-format msgid "%(people)s commented an answer" -msgstr "%(people)s comentaron la respuesta" +msgstr "" -#: forum/models.py:306 forum/models.py:418 -msgid "revisions" -msgstr "revisiones/" +#: forum/models.py:368 +msgid "interesting" +msgstr "" + +#: forum/models.py:368 +msgid "ignored" +msgstr "" -#: forum/models.py:441 templates/badges.html:51 +#: forum/models.py:538 templates/badges.html:53 msgid "gold" -msgstr "oro" +msgstr "" -#: forum/models.py:442 templates/badges.html:59 +#: forum/models.py:539 templates/badges.html:61 msgid "silver" -msgstr "plata" +msgstr "" -#: forum/models.py:443 templates/badges.html:66 +#: forum/models.py:540 templates/badges.html:68 msgid "bronze" -msgstr "bronce" +msgstr "" + +#: forum/urls.py:26 +msgid "upfiles/" +msgstr "" + +#: forum/urls.py:30 +msgid "about/" +msgstr "" + +#: forum/urls.py:31 +msgid "faq/" +msgstr "" + +#: forum/urls.py:32 +msgid "privacy/" +msgstr "" + +#: forum/urls.py:33 +msgid "logout/" +msgstr "" + +#: forum/urls.py:34 forum/urls.py:35 forum/urls.py:36 forum/urls.py:53 +msgid "answers/" +msgstr "" + +#: forum/urls.py:34 forum/urls.py:46 forum/urls.py:49 forum/urls.py:53 +msgid "comments/" +msgstr "" + +#: forum/urls.py:35 forum/urls.py:40 forum/urls.py:75 +#: templates/user_info.html:45 +msgid "edit/" +msgstr "" + +#: forum/urls.py:36 forum/urls.py:45 +msgid "revisions/" +msgstr "" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:40 +#: forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 forum/urls.py:44 +#: forum/urls.py:45 forum/urls.py:46 forum/urls.py:49 +msgid "questions/" +msgstr "" + +#: forum/urls.py:38 forum/urls.py:85 +msgid "ask/" +msgstr "" + +#: forum/urls.py:39 +msgid "unanswered/" +msgstr "" + +#: forum/urls.py:41 +msgid "close/" +msgstr "" + +#: forum/urls.py:42 +msgid "reopen/" +msgstr "" + +#: forum/urls.py:43 +msgid "answer/" +msgstr "" + +#: forum/urls.py:44 +msgid "vote/" +msgstr "" + +#: forum/urls.py:47 +msgid "command/" +msgstr "" + +#: forum/urls.py:58 forum/urls.py:59 +msgid "tags/" +msgstr "" + +#: forum/urls.py:61 forum/urls.py:65 +msgid "mark-tag/" +msgstr "" + +#: forum/urls.py:61 +msgid "interesting/" +msgstr "" + +#: forum/urls.py:65 +msgid "ignored/" +msgstr "" + +#: forum/urls.py:69 +msgid "unmark-tag/" +msgstr "" + +#: forum/urls.py:73 forum/urls.py:75 forum/urls.py:76 +msgid "users/" +msgstr "" + +#: forum/urls.py:74 +msgid "moderate-user/" +msgstr "" + +#: forum/urls.py:77 forum/urls.py:78 +msgid "badges/" +msgstr "" + +#: forum/urls.py:79 +msgid "messages/" +msgstr "" + +#: forum/urls.py:79 +msgid "markread/" +msgstr "" + +#: forum/urls.py:81 +msgid "nimda/" +msgstr "" + +#: forum/urls.py:83 +msgid "upload/" +msgstr "" + +#: forum/urls.py:84 forum/urls.py:85 forum/urls.py:86 +msgid "books/" +msgstr "" + +#: forum/urls.py:87 +msgid "search/" +msgstr "" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "" + +#: forum/urls.py:89 +msgid "account/" +msgstr "" #: forum/user.py:16 templates/user_tabs.html:7 msgid "overview" -msgstr "vista general" +msgstr "" #: forum/user.py:17 msgid "user profile" -msgstr "perfil de usuario" +msgstr "" #: forum/user.py:18 msgid "user profile overview" -msgstr "vista general del perfil de usuario" +msgstr "" #: forum/user.py:24 templates/user_tabs.html:9 msgid "recent activity" -msgstr "actividades recientes" +msgstr "" #: forum/user.py:25 msgid "recent user activity" -msgstr "actividades recientes del usuario" +msgstr "" #: forum/user.py:26 msgid "profile - recent activity" -msgstr "perfil - actividades recientes" +msgstr "" #: forum/user.py:33 templates/user_tabs.html:13 msgid "responses" -msgstr "respuestas" +msgstr "" #: forum/user.py:34 templates/user_tabs.html:12 msgid "comments and answers to others questions" -msgstr "comentarios y respuestas a preguntas de otros" +msgstr "" #: forum/user.py:35 msgid "profile - responses" -msgstr "perfil - respuestas" +msgstr "" -#: forum/user.py:42 templates/user_info.html:23 templates/users.html:26 +#: forum/user.py:42 templates/users.html:26 msgid "reputation" -msgstr "reputación" +msgstr "" #: forum/user.py:43 msgid "user reputation in the community" -msgstr "reputación del usuario en la comunidad" +msgstr "" #: forum/user.py:44 msgid "profile - user reputation" -msgstr "perfil - reputación del usuario" +msgstr "" #: forum/user.py:50 msgid "favorite questions" -msgstr "preguntas favoritas" +msgstr "" #: forum/user.py:51 msgid "users favorite questions" -msgstr "preguntas favoritas de los usuarios" +msgstr "" #: forum/user.py:52 msgid "profile - favorite questions" -msgstr "perfil - preguntas favoritas" +msgstr "" #: forum/user.py:59 templates/user_tabs.html:20 msgid "casted votes" -msgstr "votos" +msgstr "" #: forum/user.py:60 templates/user_tabs.html:20 msgid "user vote record" -msgstr "historial de votación" +msgstr "" #: forum/user.py:61 msgid "profile - votes" -msgstr "perfil - votos" +msgstr "" -#: forum/user.py:68 -msgid "preferences" -msgstr "preferencias" +#: forum/user.py:68 templates/user_tabs.html:28 +msgid "email subscriptions" +msgstr "" #: forum/user.py:69 templates/user_tabs.html:27 -msgid "user preference settings" -msgstr "preferencias del usuario" +msgid "email subscription settings" +msgstr "" #: forum/user.py:70 -msgid "profile - user preferences" -msgstr "perfil - preferencia de " +msgid "profile - email subscriptions" +msgstr "" + +#: forum/views.py:141 +msgid "Q&A forum feedback" +msgstr "" + +#: forum/views.py:142 +msgid "Thanks for the feedback!" +msgstr "" -#: forum/views.py:947 +#: forum/views.py:150 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: forum/views.py:1080 #, python-format -msgid "subscription saved, %(email)s needs validation" -msgstr "subscripción guardada, %(email)s necesita validación" +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" + +#: forum/views.py:1088 +msgid "email update frequency has been set to daily" +msgstr "" + +#: forum/views.py:1965 forum/views.py:1969 +msgid "changes saved" +msgstr "" + +#: forum/views.py:1975 +msgid "email updates canceled" +msgstr "" -#: forum/views.py:1860 +#: forum/views.py:2142 msgid "uploading images is limited to users with >60 reputation points" -msgstr "para subir imagenes debes tener más de 60 puntos de reputación" +msgstr "" -#: forum/views.py:1862 +#: forum/views.py:2144 msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" msgstr "" -"los tipos de archivos permitidos son 'jpg', 'jpeg', 'gif', 'bmp', 'png', " -"'tiff'" -#: forum/views.py:1864 +#: forum/views.py:2146 #, python-format msgid "maximum upload file size is %sK" -msgstr "tamaño máximo permitido es archivo %sK" +msgstr "" -#: forum/views.py:1866 +#: forum/views.py:2148 #, python-format msgid "" "Error uploading file. Please contact the site administrator. Thank you. %s" msgstr "" -"Error al subir el archivo. Por favor, contacte al administrador. Gracias. %s" -#: forum/management/commands/send_email_alerts.py:35 -msgid "updates from website" -msgstr "actualizaciones del sitio" +#: forum/management/commands/send_email_alerts.py:233 +msgid "email update message subject" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:234 +#, python-format +msgid "%(name)s, this is an update message header for a question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/management/commands/send_email_alerts.py:243 +#: forum/management/commands/send_email_alerts.py:258 +msgid "new question" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:268 +#, python-format +msgid "There is also one question which was recently " +msgid_plural "" +"There are also %(num)d more questions which were recently updated " +msgstr[0] "" +msgstr[1] "" + +#: forum/management/commands/send_email_alerts.py:273 +msgid "" +"Perhaps you could look up previously sent forum reminders in your mailbox." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:278 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" -#: forum/templatetags/extra_tags.py:143 forum/templatetags/extra_tags.py:172 -#: templates/header.html:35 +#: forum/templatetags/extra_tags.py:163 forum/templatetags/extra_tags.py:192 +#: templates/header.html:33 msgid "badges" -msgstr "distinciones" +msgstr "" -#: forum/templatetags/extra_tags.py:144 forum/templatetags/extra_tags.py:171 +#: forum/templatetags/extra_tags.py:164 forum/templatetags/extra_tags.py:191 msgid "reputation points" -msgstr "puntos de reputación" +msgstr "" + +#: forum/templatetags/extra_tags.py:247 +msgid "%b %d at %H:%M" +msgstr "" + +#: forum/templatetags/extra_tags.py:249 +msgid "%b %d '%y at %H:%M" +msgstr "" + +#: forum/templatetags/extra_tags.py:251 +msgid "2 days ago" +msgstr "" + +#: forum/templatetags/extra_tags.py:253 +msgid "yesterday" +msgstr "" + +#: forum/templatetags/extra_tags.py:255 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:257 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" -#: forum/templatetags/extra_tags.py:225 -msgid " ago" -msgstr " atras" +#: middleware/anon_user.py:33 +#, python-format +msgid "first time greeting with %(url)s" +msgstr "" #: templates/404.html:24 msgid "Sorry, could not find the page you requested." -msgstr "Disculpe, no se pudo encontrar la página que solicito." +msgstr "" #: templates/404.html:26 msgid "This might have happened for the following reasons:" -msgstr "Esto puede haber sucedido por alguno de los siguientes motivos:" +msgstr "" #: templates/404.html:28 msgid "this question or answer has been deleted;" -msgstr "esta pregunta o respuesta ha sido borrada;" +msgstr "" #: templates/404.html:29 msgid "url has error - please check it;" -msgstr "la url tiene un error - por favor compruebelo;" +msgstr "" #: templates/404.html:30 msgid "" "the page you tried to visit is protected or you don't have sufficient " "points, see" msgstr "" -"La pagina que intentas acceder esta protegida o no tienes los puntos de " -"reputación suficientes, ver" #: templates/404.html:31 msgid "if you believe this error 404 should not have occured, please" -msgstr "si consideras que este error 404 no debería haber sucedido, por favor" +msgstr "" #: templates/404.html:32 msgid "report this problem" -msgstr "reporta este problema" +msgstr "" #: templates/404.html:41 templates/500.html:27 msgid "back to previous page" -msgstr "volver a la página siguiente" +msgstr "" #: templates/404.html:42 msgid "see all questions" -msgstr "ver todas las preguntas" +msgstr "" #: templates/404.html:43 msgid "see all tags" -msgstr "ver todas las tags" +msgstr "" #: templates/500.html:22 msgid "sorry, system error" -msgstr "lo sentimos, ha habido un error del sistema" +msgstr "" #: templates/500.html:24 msgid "system error log is recorded, error will be fixed as soon as possible" msgstr "" -"el error del sistema ha sido registrado, y será solucionado lo antes postible" #: templates/500.html:25 msgid "please report the error to the site administrators if you wish" -msgstr "por favor reportar el error al administrador de ser posible" +msgstr "" #: templates/500.html:28 msgid "see latest questions" -msgstr "ver ultimas preguntas" +msgstr "" #: templates/500.html:29 msgid "see tags" -msgstr "ver tags" +msgstr "" #: templates/about.html:6 templates/about.html.py:11 msgid "About" -msgstr "Acerca de" +msgstr "" -#: templates/answer_edit.html:4 templates/answer_edit.html.py:47 +#: templates/answer_edit.html:5 templates/answer_edit.html.py:48 msgid "Edit answer" -msgstr "Editar respuesta" +msgstr "" -#: templates/answer_edit.html:24 templates/answer_edit.html.py:27 -#: templates/ask.html:25 templates/ask.html.py:28 templates/question.html:43 -#: templates/question.html.py:46 templates/question_edit.html:27 +#: templates/answer_edit.html:25 templates/answer_edit.html.py:28 +#: templates/ask.html:26 templates/ask.html.py:29 templates/question.html:45 +#: templates/question.html.py:48 templates/question_edit.html:25 +#: templates/question_edit.html.py:28 msgid "hide preview" -msgstr "ocultar previsualización" +msgstr "" -#: templates/answer_edit.html:27 templates/ask.html:28 -#: templates/question.html:46 templates/question_edit.html:27 +#: templates/answer_edit.html:28 templates/ask.html:29 +#: templates/question.html:48 templates/question_edit.html:28 msgid "show preview" -msgstr "ver previsualización" +msgstr "" -#: templates/answer_edit.html:47 templates/question_edit.html:65 -#: templates/question_retag.html:52 templates/revisions_answer.html:36 -#: templates/revisions_question.html:36 +#: templates/answer_edit.html:48 templates/question_edit.html:66 +#: templates/question_retag.html:53 templates/revisions_answer.html:38 +#: templates/revisions_question.html:38 msgid "back" -msgstr "volver" +msgstr "" -#: templates/answer_edit.html:52 templates/question_edit.html:70 -#: templates/revisions_answer.html:47 templates/revisions_question.html:47 +#: templates/answer_edit.html:53 templates/question_edit.html:71 +#: templates/revisions_answer.html:52 templates/revisions_question.html:52 msgid "revision" -msgstr "revisión" +msgstr "" -#: templates/answer_edit.html:55 templates/question_edit.html:74 +#: templates/answer_edit.html:56 templates/question_edit.html:75 msgid "select revision" -msgstr "seleccionar revisión" +msgstr "" -#: templates/answer_edit.html:62 templates/ask.html:94 -#: templates/question.html:467 templates/question_edit.html:91 +#: templates/answer_edit.html:63 templates/ask.html:97 +#: templates/question.html:442 templates/question_edit.html:92 msgid "Toggle the real time Markdown editor preview" -msgstr "Activar la visualización en tiempo real de Markdown" +msgstr "" -#: templates/answer_edit.html:62 templates/ask.html:94 -#: templates/question.html:467 templates/question_edit.html:91 +#: templates/answer_edit.html:63 templates/ask.html:97 +#: templates/question.html:443 templates/question_edit.html:92 msgid "toggle preview" -msgstr "Activar previsualización" +msgstr "" -#: templates/answer_edit.html:71 templates/question_edit.html:115 -#: templates/question_retag.html:73 +#: templates/answer_edit.html:72 templates/question_edit.html:124 +#: templates/question_retag.html:74 msgid "Save edit" -msgstr "Guardar la edición" +msgstr "" -#: templates/answer_edit.html:72 templates/close.html:29 -#: templates/question_edit.html:116 templates/question_retag.html:74 -#: templates/reopen.html:30 templates/user_edit.html:83 -#: templates/authopenid/changeemail.html:34 +#: templates/answer_edit.html:73 templates/close.html:29 +#: templates/feedback.html:50 templates/question_edit.html:125 +#: templates/question_retag.html:75 templates/reopen.html:30 +#: templates/user_edit.html:87 templates/authopenid/changeemail.html:40 msgid "Cancel" -msgstr "Cancelar" +msgstr "" #: templates/answer_edit_tips.html:4 msgid "answer tips" -msgstr "sugerencias sobre respuestas" +msgstr "" #: templates/answer_edit_tips.html:7 msgid "please make your answer relevant to this community" -msgstr "por favor, haz que tu respuesta sea relevante a esta comunidad" +msgstr "" #: templates/answer_edit_tips.html:10 msgid "try to give an answer, rather than engage into a discussion" -msgstr "intenta dar una respuesta, más que entablar un debate o discusión" +msgstr "" #: templates/answer_edit_tips.html:13 msgid "please try to provide details" -msgstr "por favor, intenta brindar detalles" +msgstr "" #: templates/answer_edit_tips.html:16 templates/question_edit_tips.html:13 msgid "be clear and concise" -msgstr "ser claro y conciso" +msgstr "" -#: templates/answer_edit_tips.html:19 templates/question_edit_tips.html:16 +#: templates/answer_edit_tips.html:20 templates/question_edit_tips.html:17 msgid "see frequently asked questions" -msgstr "ver preguntas frecuentes" +msgstr "" -#: templates/answer_edit_tips.html:24 templates/question_edit_tips.html:22 +#: templates/answer_edit_tips.html:26 templates/question_edit_tips.html:23 msgid "Markdown tips" -msgstr "sugerencias de Markdown" +msgstr "" -#: templates/answer_edit_tips.html:27 templates/question_edit_tips.html:25 +#: templates/answer_edit_tips.html:29 templates/question_edit_tips.html:26 msgid "*italic* or __italic__" -msgstr "*itálica* o __itálica__" +msgstr "" -#: templates/answer_edit_tips.html:30 templates/question_edit_tips.html:28 +#: templates/answer_edit_tips.html:32 templates/question_edit_tips.html:29 msgid "**bold** or __bold__" -msgstr "**negrita** o __negrita__" +msgstr "" -#: templates/answer_edit_tips.html:33 templates/question_edit_tips.html:31 +#: templates/answer_edit_tips.html:35 templates/question_edit_tips.html:32 msgid "link" -msgstr "enlace" +msgstr "" -#: templates/answer_edit_tips.html:33 templates/answer_edit_tips.html.py:37 -#: templates/question_edit_tips.html:31 templates/question_edit_tips.html:36 +#: templates/answer_edit_tips.html:35 templates/answer_edit_tips.html.py:39 +#: templates/question_edit_tips.html:32 templates/question_edit_tips.html:37 msgid "text" -msgstr "texto" +msgstr "" -#: templates/answer_edit_tips.html:37 templates/question_edit_tips.html:36 +#: templates/answer_edit_tips.html:39 templates/question_edit_tips.html:37 msgid "image" -msgstr "imagen" +msgstr "" -#: templates/answer_edit_tips.html:41 templates/question_edit_tips.html:40 +#: templates/answer_edit_tips.html:43 templates/question_edit_tips.html:41 msgid "numbered list:" -msgstr "lista numerada" +msgstr "" -#: templates/answer_edit_tips.html:46 templates/question_edit_tips.html:45 +#: templates/answer_edit_tips.html:48 templates/question_edit_tips.html:46 msgid "basic HTML tags are also supported" -msgstr "etiquetas básicas de HTML permitidas" +msgstr "" -#: templates/answer_edit_tips.html:49 templates/question_edit_tips.html:48 +#: templates/answer_edit_tips.html:52 templates/question_edit_tips.html:50 msgid "learn more about Markdown" -msgstr "aprender mas sobre Markdown" +msgstr "" -#: templates/ask.html:4 templates/ask.html.py:60 +#: templates/ask.html:5 templates/ask.html.py:61 msgid "Ask a question" -msgstr "Hacer una pregunta" +msgstr "" -#: templates/ask.html:67 +#: templates/ask.html:68 msgid "login to post question info" msgstr "" -"<span class='strong big'>Puedes comenzar a realizar tu pregunta de forma " -"anonima</span> - actualmente no te encuentras Ingresado. Cuando envíes tu " -"pregunta, serás redireccionado a la página de Ingreso/registro. Tu pregunta " -"será guardada temporalemente y será enviada cuando ingreses. El proceso de " -"Ingreso/Registro es muy simple. Ingresar lleva unos 30 segundos, registrarse " -"por primera vez lleva un minuto." -#: templates/ask.html:73 +#: templates/ask.html:74 #, python-format -msgid "must have valid %(email)s to post" +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " msgstr "" -"<span class='strong big'>Parece ser que tu dirección de email, %(email)s no " -"ha sido validada aún.</span> Para enviar mensajes debes verificar tu " -"dirección de email, puedes ver <a href='/faq#validate'>más detalles aquí</" -"a>. <br/> Puedes enviar tu pregunta ahora y validar tu email luego. Tu " -"pregunta será guardada mientras tanto y publicada cuando valides tu email." -#: templates/ask.html:107 +#: templates/ask.html:112 templates/ask.html.py:119 +#: templates/question_edit.html:120 msgid "(required)" -msgstr "(requerido)" +msgstr "" -#: templates/ask.html:114 +#: templates/ask.html:126 msgid "Login/signup to post your question" -msgstr "Iniciar sesión/registrarse para publicar su pregunta" +msgstr "" -#: templates/ask.html:116 +#: templates/ask.html:128 msgid "Ask your question" -msgstr "Haz tu pregunta" +msgstr "" #: templates/badge.html:6 templates/badge.html.py:17 msgid "Badge" -msgstr "Distinción" +msgstr "" #: templates/badge.html:26 msgid "The users have been awarded with badges:" -msgstr "Usuarios han sido galardonados con distinciones:" +msgstr "" #: templates/badges.html:6 msgid "Badges summary" -msgstr "Resumen de distinciones" +msgstr "" -#: templates/badges.html:17 templates/user_stats.html:115 +#: templates/badges.html:17 msgid "Badges" -msgstr "Distinciones" +msgstr "" #: templates/badges.html:21 msgid "Community gives you awards for your questions, answers and votes." -msgstr "La comunidad te da distinciones por tus preguntas, respuestas y votos." +msgstr "" #: templates/badges.html:22 +#, python-format msgid "" -"Below is the list of available badges and number of times each type of badge " -"has been awarded." +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " msgstr "" -"Debajo esta la lista de las distinciones disponibles y la cantidad de veces " -"que han sido asignadas." -#: templates/badges.html:48 +#: templates/badges.html:50 msgid "Community badges" -msgstr "Distinciones de la comunidad" +msgstr "" -#: templates/badges.html:54 +#: templates/badges.html:56 msgid "gold badge description" msgstr "" -"Las distinciones de Oro son excepcionales. Para obtenerla debes demostrar un " -"profundo conocimiento y habilidad además de participar activamente en la " -"comunidad. La distinción de Oro es la condecoración máxima en esta comunidad" -#: templates/badges.html:62 +#: templates/badges.html:64 msgid "silver badge description" msgstr "" -"Obtener una distinción de Plata requiere de paciencia. Si has logrado una, " -"quiere decir que haz significativamente aportado a esta comunidad." -#: templates/badges.html:65 +#: templates/badges.html:67 msgid "bronze badge: often given as a special honor" msgstr "" -"distinción de bronce: con frecuencia entregada como reconocimiento especial." -#: templates/badges.html:69 +#: templates/badges.html:71 msgid "bronze badge description" msgstr "" -"Si eres un usuario activo de esta comunidad, recibirás esta distinción - de " -"todas maneras es un honor especial." #: templates/book.html:7 msgid "reading channel" -msgstr "canal de lectura" +msgstr "" #: templates/book.html:26 msgid "[author]" -msgstr "[autor]" +msgstr "" #: templates/book.html:30 msgid "[publisher]" -msgstr "[editorial]" +msgstr "" #: templates/book.html:34 msgid "[publication date]" -msgstr "[fecha de publicación]" +msgstr "" #: templates/book.html:38 msgid "[price]" -msgstr "[precio]" +msgstr "" #: templates/book.html:39 msgid "currency unit" -msgstr "unidad de moneda" +msgstr "" #: templates/book.html:42 msgid "[pages]" -msgstr "[páginas]" +msgstr "" #: templates/book.html:43 msgid "pages abbreviation" -msgstr "abreviación de páginas" +msgstr "" #: templates/book.html:46 msgid "[tags]" -msgstr "[etiquetas]" +msgstr "" #: templates/book.html:56 msgid "author blog" -msgstr "blog del autor" +msgstr "" #: templates/book.html:62 msgid "book directory" -msgstr "directorio del libro" +msgstr "" #: templates/book.html:66 msgid "buy online" -msgstr "comprar en-linea" +msgstr "" #: templates/book.html:79 msgid "reader questions" -msgstr "pregunta de lector" +msgstr "" #: templates/book.html:82 msgid "ask the author" -msgstr "preguntar al autor" +msgstr "" #: templates/book.html:88 templates/book.html.py:93 -#: templates/users_questions.html:17 +#: templates/users_questions.html:18 msgid "this question was selected as favorite" -msgstr "esta pregunta ha sido seleccionada como favorita" +msgstr "" #: templates/book.html:88 templates/book.html.py:93 -#: templates/users_questions.html:11 templates/users_questions.html.py:17 +#: templates/users_questions.html:11 templates/users_questions.html.py:18 msgid "number of times" -msgstr "numero de veces" +msgstr "" -#: templates/book.html:105 templates/index.html:48 templates/questions.html:46 -#: templates/unanswered.html:37 templates/users_questions.html:30 +#: templates/book.html:105 templates/index.html:50 +#: templates/question_summary_list_roll.html:14 templates/questions.html:84 +#: templates/unanswered.html:39 templates/users_questions.html:32 msgid "votes" -msgstr "votos" +msgstr "" #: templates/book.html:108 msgid "the answer has been accepted to be correct" -msgstr "la respuesta ha sido aceptada como correcta" +msgstr "" -#: templates/book.html:115 templates/index.html:49 templates/questions.html:47 -#: templates/unanswered.html:38 templates/users_questions.html:40 +#: templates/book.html:115 templates/index.html:51 +#: templates/question_summary_list_roll.html:15 templates/questions.html:85 +#: templates/unanswered.html:40 templates/users_questions.html:40 msgid "views" -msgstr "vistas" +msgstr "" -#: templates/book.html:125 templates/index.html:69 templates/question.html:499 -#: templates/questions.html:84 templates/questions.html.py:156 -#: templates/tags.html:49 templates/unanswered.html:75 -#: templates/unanswered.html.py:106 templates/users_questions.html:52 +#: templates/book.html:125 templates/index.html:106 +#: templates/question.html:488 templates/question_summary_list_roll.html:52 +#: templates/questions.html:140 templates/questions.html.py:257 +#: templates/tags.html:49 templates/unanswered.html:95 +#: templates/unanswered.html.py:122 templates/users_questions.html:52 msgid "using tags" -msgstr "usando etiquetas" +msgstr "" #: templates/book.html:147 msgid "subscribe to book RSS feed" -msgstr "suscribirse al RSS del libro" +msgstr "" -#: templates/book.html:147 templates/index.html:118 +#: templates/book.html:147 templates/index.html:157 msgid "subscribe to the questions feed" -msgstr "suscribirse al agregado de noticias" +msgstr "" #: templates/close.html:6 templates/close.html.py:16 msgid "Close question" -msgstr "Cerrar pregunta" +msgstr "" #: templates/close.html:19 msgid "Close the question" -msgstr "Cerrar la pregunta" +msgstr "" #: templates/close.html:25 msgid "Reasons" -msgstr "Razón" +msgstr "" #: templates/close.html:28 msgid "OK to close" -msgstr "OK para cerrar" +msgstr "" #: templates/faq.html:11 msgid "Frequently Asked Questions " -msgstr "Preguntas Frecuentes" +msgstr "" #: templates/faq.html:16 msgid "What kinds of questions can I ask here?" -msgstr "¿Qué clase de preguntas puedo hacer aquí?" +msgstr "" #: templates/faq.html:17 msgid "" "Most importanly - questions should be <strong>relevant</strong> to this " "community." msgstr "" -"Por encima de todo - las preguntas deben ser <strong>relevantes</strong>a " -"esta comunidad." #: templates/faq.html:18 msgid "" "Before asking the question - please make sure to use search to see whether " "your question has alredy been answered." msgstr "" -"Antes de hacer tu pregunta - por favor usa el buscador para asegurarte que " -"la pregunta no este ya hecha." #: templates/faq.html:21 msgid "What questions should I avoid asking?" -msgstr "¿Qué preguntas debería evitar preguntar?" +msgstr "" #: templates/faq.html:22 msgid "" "Please avoid asking questions that are not relevant to this community, too " "subjective and argumentative." msgstr "" -"Evita hacer preguntas que no son relevantes a la comunidad, demasiado " -"subjetivas o argumentativas." #: templates/faq.html:27 msgid "What should I avoid in my answers?" -msgstr "¿Que debo evitar en mis respuestas?" +msgstr "" #: templates/faq.html:28 msgid "" @@ -1181,42 +1455,32 @@ msgid "" "discussions in your answers, comment facility allows some space for brief " "discussions." msgstr "" -"es un sitio de Preguntas y Respuestas, no un grupo de discusión. Por ende, " -"intenta evitar discusiones en tus respuestas. Los comentarios permiten " -"realizar pequeñas discusiones." #: templates/faq.html:32 msgid "Who moderates this community?" -msgstr "¿Quién modera esta comunidad?" +msgstr "" #: templates/faq.html:33 msgid "The short answer is: <strong>you</strong>." -msgstr "La respuesta corta es: <strong>tú</strong>" +msgstr "" #: templates/faq.html:34 msgid "This website is moderated by the users." -msgstr "Este sitio es moderado por los usuarios." +msgstr "" #: templates/faq.html:35 msgid "" "The reputation system allows users earn the authorization to perform a " "variety of moderation tasks." msgstr "" -"El sistema de reputación permite a los usuarios adquirir autorización para " -"realizar diversas tareas de moderación." #: templates/faq.html:40 msgid "How does reputation system work?" -msgstr "¿Cómo funciona el sistema de reputación?" +msgstr "" #: templates/faq.html:41 msgid "Rep system summary" msgstr "" -"Cuando una pregunta o respuesta es votada positivamente, el usuario que la " -"realizo ganará algunos puntos, que llamamos \"puntos de reputación\". Estos " -"puntos sirven a groso modo para medir la confianza que la comunidad le " -"tiene. Diversas tareas de moderación son gradualmente asignadas a los " -"usuarios basado en estos puntos de reputación." #: templates/faq.html:42 msgid "" @@ -1228,657 +1492,804 @@ msgid "" "or answer. The table below explains reputation point requirements for each " "type of moderation task." msgstr "" -"Por ejemplo, si haces una pregunta interesante o das una respuesta útil, tu " -"adición será votada positivamente. Por otro lado, si la respuesta es fuera " -"de lugar - será votada negativamente. Cada voto a favor genera <strong>10</" -"strong> puntos, cada voto en contra restará <strong>2</strong> puntos. Hay " -"un limite de <strong>200</strong> puntos que puedes acumular por pregunta o " -"respuesta. La tabla debajo explica los puntos de reputación requeridos para " -"cada tarea de moderación." -#: templates/faq.html:53 templates/user_votes.html:14 +#: templates/faq.html:53 templates/user_votes.html:15 msgid "upvote" -msgstr "votar positivo" +msgstr "" #: templates/faq.html:57 msgid "use tags" -msgstr "etiquetas usadas" +msgstr "" #: templates/faq.html:62 msgid "add comments" -msgstr "agregar comentarios" +msgstr "" -#: templates/faq.html:66 templates/user_votes.html:16 +#: templates/faq.html:66 templates/user_votes.html:17 msgid "downvote" -msgstr "votar negativo" +msgstr "" #: templates/faq.html:69 msgid "open and close own questions" -msgstr "abrir y cerrar sus propias preguntas" +msgstr "" #: templates/faq.html:73 msgid "retag questions" -msgstr "re-etiquetar preguntas" +msgstr "" -#: templates/faq.html:77 +#: templates/faq.html:78 msgid "edit community wiki questions" -msgstr "editar preguntas de la wiki comunitaria" +msgstr "" -#: templates/faq.html:81 +#: templates/faq.html:83 msgid "edit any answer" -msgstr "editar cualquier pregunta" +msgstr "" -#: templates/faq.html:85 +#: templates/faq.html:87 msgid "open any closed question" -msgstr "abrir cualquier pregunta cerrada" +msgstr "" -#: templates/faq.html:89 +#: templates/faq.html:91 msgid "delete any comment" -msgstr "borrar cualquier comentario" +msgstr "" -#: templates/faq.html:93 +#: templates/faq.html:95 msgid "delete any questions and answers and perform other moderation tasks" msgstr "" -"borrar cualquier pregunta o respuesta y realizar otras tareas de " -"administración." -#: templates/faq.html:100 +#: templates/faq.html:102 msgid "how to validate email title" -msgstr "¿Cómo validar mi correo electrónico?" +msgstr "" -#: templates/faq.html:102 -msgid "how to validate email info" -msgstr "" -"<form style='margin:0;padding:0;' action='/email/sendkey/'><p><span class=" -"\"bigger strong\">¿Cómo?</span> Si acabas de asignar o cambiar tu correo " -"electrónico - <strong>verifica tu casilla de mensajes y clickea en el link " -"incluido</strong>. <br/> El link contiene una clave generada especificamente " -"para ti. <button style='display:inline' type='submit'><strong>get a new key</" -"strong></button> y vuelve a revisar tu casilla de mensajes.</p></form><span " -"class=\"bigger strong\">¿Porqué?</span> La validación del email es requerida " -"para estar seguros the que <strong>solo tu puedes enviar mensajes</strong> " -"bajo tu concentimiento y para <strong>minimizar el spam</strong>.<br/> Con " -"tu email podrás <strong>suscribirte a actualizaciones</strong> en las " -"preguntas mas interesantes. También, cuando te registras por primera vez - " -"se crea un imagen personal única de <a href='/" -"faq#gravatar'><strong>gravatar</strong></a>." - -#: templates/faq.html:106 +#: templates/faq.html:104 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" + +#: templates/faq.html:108 msgid "what is gravatar" -msgstr "¿Qué es gravatar?" +msgstr "" -#: templates/faq.html:107 +#: templates/faq.html:109 msgid "gravatar faq info" msgstr "" -"<strong>Gravatar</strong> significa <strong>g</strong>lobalmente <strong>r</" -"strong>econocido <strong>avatar</strong> - tu imagen única asociada a tu " -"email. Es simplemente una imagen que se muestra junto con tus mensajes en " -"sitios que soportan gravatar. Por defecto gravatar aparece como un cuadrado " -"rellenado con figuras parecidas a copos de nieve. Puedes <strong>seleccionar " -"tu imagen</strong> en <a href='http://gravatar.com'><strong>gravatar.com</" -"strong></a>" -#: templates/faq.html:110 +#: templates/faq.html:112 msgid "To register, do I need to create new password?" -msgstr "¿Para registrarme, debo crearme una cuenta?" +msgstr "" -#: templates/faq.html:111 +#: templates/faq.html:113 msgid "" "No, you don't have to. You can login through any service that supports " "OpenID, e.g. Google, Yahoo, AOL, etc." msgstr "" -"No tienes porqué. Puedes ingresar usando cualquiera de los servicios que " -"soportan OpenID, ej. Google, Yahoo, AOL, MyOpenID, etc." -#: templates/faq.html:112 +#: templates/faq.html:114 msgid "Login now!" -msgstr "Ingresa ahora!" +msgstr "" -#: templates/faq.html:117 +#: templates/faq.html:119 msgid "Why other people can edit my questions/answers?" -msgstr "¿Porqué otras personas pueden editar mis preguntas y respuestas?" +msgstr "" -#: templates/faq.html:118 +#: templates/faq.html:120 msgid "Goal of this site is..." msgstr "" -"El objetivo de este sitio es generar contenido valioso mediante preguntas y " -"respuestas, de forma colaborativa. " -#: templates/faq.html:118 +#: templates/faq.html:120 msgid "" "So questions and answers can be edited like wiki pages by experienced users " "of this site and this improves the overall quality of the knowledge base " "content." msgstr "" -"Entonces, las preguntas y respuestas pueden ser editadas como wiki por " -"usuarios con experiencia, y esto mejora la calidad general del conocimiento " -"acumulado." -#: templates/faq.html:119 +#: templates/faq.html:121 msgid "If this approach is not for you, we respect your choice." msgstr "" -"Si esta forma de funcionamiento no es de tu agrado, respetamos tu elección." -#: templates/faq.html:123 +#: templates/faq.html:125 msgid "Still have questions?" -msgstr "¿Aún tienes preguntas?" +msgstr "" -#: templates/faq.html:124 -msgid "Please ask your question, help make our community better!" -msgstr "Por favor haz tu pregunta, ¡ayudanos a mejorar nuestra comunidad!" +#: templates/faq.html:126 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" -#: templates/faq.html:126 templates/header.html:29 templates/header.html.py:63 +#: templates/faq.html:128 templates/header.html:27 templates/header.html.py:61 msgid "questions" -msgstr "preguntas" +msgstr "" -#: templates/faq.html:126 templates/index.html:123 +#: templates/faq.html:128 templates/index.html:162 msgid "." -msgstr "." +msgstr "" + +#: templates/feedback.html:6 +msgid "Feedback" +msgstr "" + +#: templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "" + +#: templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" <span class='big strong'>Dear %(user_name)s</span>, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: templates/feedback.html:24 +msgid "" +"\n" +" <span class='big strong'>Dear visitor</span>, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" -#: templates/footer.html:7 templates/header.html:14 templates/index.html:83 +#: templates/feedback.html:41 +msgid "(this field is required)" +msgstr "" + +#: templates/feedback.html:49 +msgid "Send Feedback" +msgstr "" + +#: templates/footer.html:8 templates/header.html:13 templates/index.html:120 msgid "about" -msgstr "acerca de nosotros" +msgstr "" -#: templates/footer.html:8 templates/header.html:15 templates/index.html:84 -#: templates/question_edit_tips.html:16 +#: templates/footer.html:9 templates/header.html:14 templates/index.html:121 +#: templates/question_edit_tips.html:17 msgid "faq" -msgstr "preguntas frecuentes" +msgstr "" -#: templates/footer.html:9 +#: templates/footer.html:10 msgid "blog" -msgstr "blog" +msgstr "" -#: templates/footer.html:10 +#: templates/footer.html:11 msgid "contact us" -msgstr "contactenos" +msgstr "" -#: templates/footer.html:11 +#: templates/footer.html:12 msgid "privacy policy" -msgstr "código de privacidad" +msgstr "" -#: templates/footer.html:12 +#: templates/footer.html:21 msgid "give feedback" -msgstr "envía comentarios" - -#: templates/footer.html:18 -msgid "current revision" -msgstr "revisión actual" +msgstr "" -#: templates/header.html:10 +#: templates/header.html:9 msgid "logout" -msgstr "salir" +msgstr "" -#: templates/header.html:12 templates/authopenid/signup.html:41 +#: templates/header.html:11 msgid "login" -msgstr "entrar" +msgstr "" -#: templates/header.html:23 +#: templates/header.html:21 msgid "back to home page" -msgstr "volver página principal" +msgstr "" -#: templates/header.html:31 templates/header.html.py:65 +#: templates/header.html:29 templates/header.html.py:63 msgid "users" -msgstr "usuarios" +msgstr "" -#: templates/header.html:33 +#: templates/header.html:31 msgid "books" -msgstr "libros" +msgstr "" -#: templates/header.html:36 +#: templates/header.html:34 msgid "unanswered questions" -msgstr "sin respuesta" +msgstr "" -#: templates/header.html:40 +#: templates/header.html:38 msgid "my profile" -msgstr "mi perfil" +msgstr "" -#: templates/header.html:44 +#: templates/header.html:42 msgid "ask a question" -msgstr "hacer una pregunta" +msgstr "" -#: templates/header.html:59 +#: templates/header.html:57 msgid "search" -msgstr "buscar" +msgstr "" -#: templates/index.html:7 +#: templates/index.html:8 msgid "Home" -msgstr "Inicio" +msgstr "" -#: templates/index.html:22 templates/questions.html:7 +#: templates/index.html:25 templates/questions.html:8 msgid "Questions" -msgstr "Preguntas" +msgstr "" -#: templates/index.html:24 +#: templates/index.html:27 msgid "last updated questions" -msgstr "ultimas preguntas actualizadas" +msgstr "" -#: templates/index.html:24 templates/questions.html:25 -#: templates/unanswered.html:20 +#: templates/index.html:27 templates/questions.html:51 +#: templates/unanswered.html:21 msgid "newest" -msgstr "más nuevas" +msgstr "" + +#: templates/index.html:28 templates/questions.html:52 +msgid "most recently updated questions" +msgstr "" -#: templates/index.html:25 templates/questions.html:27 +#: templates/index.html:28 templates/questions.html:52 +msgid "active" +msgstr "" + +#: templates/index.html:29 templates/questions.html:53 msgid "hottest questions" -msgstr "preguntas calientes" +msgstr "" -#: templates/index.html:25 templates/questions.html:27 +#: templates/index.html:29 templates/questions.html:53 msgid "hottest" -msgstr "más calientes" +msgstr "" -#: templates/index.html:26 templates/questions.html:28 +#: templates/index.html:30 templates/questions.html:54 msgid "most voted questions" -msgstr "preguntas más votadas" +msgstr "" -#: templates/index.html:26 templates/questions.html:28 +#: templates/index.html:30 templates/questions.html:54 msgid "most voted" -msgstr "más votadas" +msgstr "" -#: templates/index.html:27 +#: templates/index.html:31 msgid "all questions" -msgstr "todas las preguntas" +msgstr "" -#: templates/index.html:47 templates/questions.html:45 -#: templates/unanswered.html:36 templates/users_questions.html:35 +#: templates/index.html:49 templates/question_summary_list_roll.html:13 +#: templates/questions.html:83 templates/unanswered.html:38 +#: templates/users_questions.html:36 msgid "answers" -msgstr "respuestas" +msgstr "" + +#: templates/index.html:81 templates/index.html.py:95 +#: templates/questions.html:115 templates/questions.html.py:129 +#: templates/unanswered.html:70 templates/unanswered.html.py:84 +msgid "Posted:" +msgstr "" + +#: templates/index.html:84 templates/index.html.py:89 +#: templates/questions.html:118 templates/questions.html.py:123 +#: templates/unanswered.html:73 templates/unanswered.html.py:78 +msgid "Updated:" +msgstr "" -#: templates/index.html:69 templates/question.html:499 -#: templates/questions.html:84 templates/questions.html.py:156 -#: templates/tags.html:49 templates/unanswered.html:75 -#: templates/unanswered.html.py:106 templates/users_questions.html:52 +#: templates/index.html:106 templates/question.html:488 +#: templates/question_summary_list_roll.html:52 templates/questions.html:140 +#: templates/questions.html.py:257 templates/tags.html:49 +#: templates/unanswered.html:95 templates/unanswered.html.py:122 +#: templates/users_questions.html:52 msgid "see questions tagged" -msgstr "ver preguntas etiquetadas" +msgstr "" -#: templates/index.html:80 +#: templates/index.html:117 msgid "welcome to website" -msgstr "bienvenido a sitio" +msgstr "" -#: templates/index.html:89 +#: templates/index.html:128 msgid "Recent tags" -msgstr "Etiquetas recientes" +msgstr "" -#: templates/index.html:94 templates/question.html:125 +#: templates/index.html:133 templates/question.html:135 #, python-format msgid "see questions tagged '%(tagname)s'" -msgstr "ver preguntas etiquetadas '%(tagname)s'" +msgstr "" -#: templates/index.html:97 templates/index.html.py:123 +#: templates/index.html:136 templates/index.html.py:162 msgid "popular tags" -msgstr "etiquetas populares" +msgstr "" -#: templates/index.html:102 +#: templates/index.html:141 msgid "Recent awards" -msgstr "Reconocimientos recientes" +msgstr "" -#: templates/index.html:108 +#: templates/index.html:147 msgid "given to" -msgstr "dados a" +msgstr "" -#: templates/index.html:113 +#: templates/index.html:152 msgid "all awards" -msgstr "todos los reconocimientos" +msgstr "" -#: templates/index.html:118 +#: templates/index.html:157 msgid "subscribe to last 30 questions by RSS" -msgstr "suscribirse a las últimas 30 preguntas por RSS" +msgstr "" -#: templates/index.html:123 +#: templates/index.html:162 msgid "Still looking for more? See" -msgstr "¿Aún sigues buscando más? Ver" +msgstr "" -#: templates/index.html:123 +#: templates/index.html:162 msgid "complete list of questions" -msgstr "lista completa de preguntas" +msgstr "" -#: templates/index.html:123 +#: templates/index.html:162 templates/authopenid/signup.html:18 msgid "or" -msgstr "ó" +msgstr "" -#: templates/index.html:123 +#: templates/index.html:162 msgid "Please help us answer" -msgstr "Ayudanos a responder" +msgstr "" -#: templates/index.html:123 +#: templates/index.html:162 msgid "list of unanswered questions" -msgstr "lista de preguntas sin respuesta" +msgstr "" -#: templates/logout.html:6 templates/logout.html.py:17 +#: templates/logout.html:6 templates/logout.html.py:16 msgid "Logout" -msgstr "Salir" +msgstr "" -#: templates/logout.html:20 +#: templates/logout.html:19 msgid "" "As a registered user you can login with your OpenID, log out of the site or " "permanently remove your account." msgstr "" -"Como usuario registrado puedes ingresar con tu OpenID, salir del sitio o " -"eliminar de forma permanente tu cuenta." -#: templates/logout.html:21 +#: templates/logout.html:20 msgid "Logout now" -msgstr "Salir ahora" +msgstr "" #: templates/pagesize.html:6 msgid "posts per page" -msgstr "entradas por página" +msgstr "" #: templates/paginator.html:6 templates/paginator.html.py:7 msgid "previous" -msgstr "previo" +msgstr "" #: templates/paginator.html:19 msgid "current page" -msgstr "página actúal" +msgstr "" #: templates/paginator.html:22 templates/paginator.html.py:29 msgid "page number " -msgstr "número de página" +msgstr "" #: templates/paginator.html:22 templates/paginator.html.py:29 msgid "number - make blank in english" -msgstr " " +msgstr "" #: templates/paginator.html:33 msgid "next page" -msgstr "próxima página" +msgstr "" + +#: templates/post_contributor_info.html:9 +#, python-format +msgid "" +"\n" +" one revision\n" +" " +msgid_plural "" +"\n" +" %(rev_count)s revisions\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/post_contributor_info.html:19 +msgid "asked" +msgstr "" + +#: templates/post_contributor_info.html:22 +msgid "answered" +msgstr "" + +#: templates/post_contributor_info.html:24 +msgid "posted" +msgstr "" + +#: templates/post_contributor_info.html:45 +msgid "updated" +msgstr "" #: templates/privacy.html:6 templates/privacy.html.py:11 msgid "Privacy policy" -msgstr "Privacidad" +msgstr "" #: templates/privacy.html:15 msgid "general message about privacy" -msgstr "mensaje de privacidad" +msgstr "" #: templates/privacy.html:18 msgid "Site Visitors" -msgstr "Visitantes del Sitio" +msgstr "" #: templates/privacy.html:20 msgid "what technical information is collected about visitors" -msgstr "que información es recolectada sobre los usuarios" +msgstr "" #: templates/privacy.html:23 msgid "Personal Information" -msgstr "Información Personal" +msgstr "" #: templates/privacy.html:25 msgid "details on personal information policies" -msgstr "describir código de manejo de la información personal" +msgstr "" #: templates/privacy.html:28 msgid "Other Services" -msgstr "Otros servicios" +msgstr "" #: templates/privacy.html:30 msgid "details on sharing data with third parties" -msgstr "detalles sobre compartir información con terceros" +msgstr "" #: templates/privacy.html:35 msgid "cookie policy details" -msgstr "uso de cookies" +msgstr "" #: templates/privacy.html:37 msgid "Policy Changes" -msgstr "Cambios de Códigos" +msgstr "" #: templates/privacy.html:38 msgid "how privacy policies can be changed" -msgstr "como pueden ser cambiados los códigos de privacidad" +msgstr "" -#: templates/question.html:72 templates/question.html.py:73 -#: templates/question.html:85 templates/question.html.py:87 +#: templates/question.html:77 templates/question.html.py:78 +#: templates/question.html:94 templates/question.html.py:96 msgid "i like this post (click again to cancel)" -msgstr "Me gusta esta entrada (clickear devuelta para cancelar)" +msgstr "" -#: templates/question.html:75 templates/question.html.py:89 -#: templates/question.html:289 +#: templates/question.html:80 templates/question.html.py:98 +#: templates/question.html:257 msgid "current number of votes" -msgstr "número actual de votos" +msgstr "" -#: templates/question.html:80 templates/question.html.py:81 -#: templates/question.html:94 templates/question.html.py:95 +#: templates/question.html:89 templates/question.html.py:90 +#: templates/question.html:103 templates/question.html.py:104 msgid "i dont like this post (click again to cancel)" -msgstr "No me gusta esta entrada (clickear devuelta para cancelar)" +msgstr "" -#: templates/question.html:100 templates/question.html.py:101 +#: templates/question.html:109 templates/question.html.py:110 msgid "mark this question as favorite (click again to cancel)" -msgstr "marcar esta pregunta como favorita (clickear devuelta para cancelar)" +msgstr "" -#: templates/question.html:107 templates/question.html.py:108 +#: templates/question.html:116 templates/question.html.py:117 msgid "remove favorite mark from this question (click again to restore mark)" msgstr "" -"remover marca de favorito a esta pregunta (clickear devuelta para volver a " -"marcar)" -#: templates/question.html:134 templates/question.html.py:322 -#: templates/revisions_answer.html:53 templates/revisions_question.html:53 +#: templates/question.html:140 templates/question.html.py:294 +#: templates/revisions_answer.html:58 templates/revisions_question.html:58 msgid "edit" -msgstr "editar" - -#: templates/question.html:138 templates/question.html.py:332 -msgid "delete" -msgstr "borrar" +msgstr "" -#: templates/question.html:143 +#: templates/question.html:145 msgid "reopen" -msgstr "re-abrir" +msgstr "" -#: templates/question.html:148 +#: templates/question.html:149 msgid "close" -msgstr "cerrar" +msgstr "" -#: templates/question.html:154 templates/question.html.py:345 +#: templates/question.html:155 templates/question.html.py:300 msgid "" "report as offensive (i.e containing spam, advertising, malicious text, etc.)" msgstr "" -"reportar como ofensivo (ej. contiene spam, publicidad, texto malicioso, etc.)" -#: templates/question.html:155 templates/question.html.py:346 +#: templates/question.html:156 templates/question.html.py:301 msgid "flag offensive" -msgstr "marcar como ofensivo" - -#: templates/question.html:167 templates/question.html.py:355 -#: templates/revisions_answer.html:65 templates/revisions_question.html:65 -msgid "updated" -msgstr "actualizado" +msgstr "" -#: templates/question.html:216 templates/question.html.py:402 -#: templates/revisions_answer.html:63 templates/revisions_question.html:63 -msgid "asked" -msgstr "preguntado" +#: templates/question.html:164 templates/question.html.py:312 +msgid "delete" +msgstr "" -#: templates/question.html:246 templates/question.html.py:429 -msgid "comments" -msgstr "comentarios" +#: templates/question.html:182 templates/question.html.py:332 +msgid "delete this comment" +msgstr "" -#: templates/question.html:247 templates/question.html.py:430 +#: templates/question.html:193 templates/question.html.py:343 +#: templates/question.html:367 msgid "add comment" -msgstr "agregar comentario" +msgstr "" + +#: templates/question.html:197 +#, python-format +msgid "" +"\n" +" see <strong>one</strong> more \n" +" " +msgid_plural "" +"\n" +" see <strong>%(counter)s</strong> " +"more\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/question.html:203 +#, python-format +msgid "" +"\n" +" see <strong>one</strong> more " +"comment\n" +" " +msgid_plural "" +"\n" +" see <strong>%(counter)s</strong> " +"more comments\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/question.html:260 +#: templates/question.html:219 #, python-format msgid "" -"The question has been closed for the following reason \"%(question." -"get_close_reason_display)s\" by" +"The question has been closed for the following reason \"%(close_reason)s\" by" msgstr "" -"La pregunta ha sido cerrada por el siguiente motivo \"%(question." -"get_close_reason_display)s\" por" -#: templates/question.html:262 +#: templates/question.html:221 #, python-format -msgid "close date %(question.closed_at)s" -msgstr "fecha de cerrada %(question.closed_at)s" +msgid "close date %(closed_at)s" +msgstr "" -#: templates/question.html:269 templates/user_stats.html:28 -msgid "Answers" -msgstr "Respuestas" +#: templates/question.html:229 +#, python-format +msgid "" +"\n" +" One Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/question.html:271 +#: templates/question.html:237 msgid "oldest answers will be shown first" -msgstr "la respuesta mas vieja será mostrada primero" +msgstr "" -#: templates/question.html:271 +#: templates/question.html:237 msgid "oldest answers" -msgstr "pregunta más vieja" +msgstr "" -#: templates/question.html:272 +#: templates/question.html:239 msgid "newest answers will be shown first" -msgstr "preguntas más nuevas serán mostradas primero" +msgstr "" -#: templates/question.html:272 +#: templates/question.html:239 msgid "newest answers" -msgstr "más nuevas" +msgstr "" -#: templates/question.html:273 +#: templates/question.html:241 msgid "most voted answers will be shown first" -msgstr "las preguntas más votadas serán mostradas primero" +msgstr "" -#: templates/question.html:273 +#: templates/question.html:241 msgid "popular answers" -msgstr "respuestas populares" +msgstr "" -#: templates/question.html:287 templates/question.html.py:288 +#: templates/question.html:255 templates/question.html.py:256 msgid "i like this answer (click again to cancel)" -msgstr "me gusta esta respuesta (clickear devuelta para cancelar)" +msgstr "" -#: templates/question.html:294 templates/question.html.py:295 +#: templates/question.html:262 templates/question.html.py:263 msgid "i dont like this answer (click again to cancel)" -msgstr "no me gusta esta respuesta (clickear devuelta para cancelar)" +msgstr "" -#: templates/question.html:300 templates/question.html.py:301 +#: templates/question.html:268 templates/question.html.py:269 msgid "mark this answer as favorite (click again to undo)" -msgstr "marcar esta respuesta como favorita (clickear devuelta para deshacer)" +msgstr "" -#: templates/question.html:306 templates/question.html.py:307 +#: templates/question.html:274 templates/question.html.py:275 msgid "the author of the question has selected this answer as correct" -msgstr "el autor de esta pregunta ha seleccionado esta respuesta como correcta" - -#: templates/question.html:329 -msgid "undelete" -msgstr "deshacer eliminar" +msgstr "" -#: templates/question.html:339 +#: templates/question.html:288 msgid "answer permanent link" -msgstr "enlace permanente a respuesta" +msgstr "" -#: templates/question.html:340 +#: templates/question.html:289 msgid "permanent link" -msgstr "enlace permanente" +msgstr "" + +#: templates/question.html:312 +msgid "undelete" +msgstr "" + +#: templates/question.html:347 +#, python-format +msgid "" +"\n" +" see <strong>one</" +"strong> more \n" +" " +msgid_plural "" +"\n" +" see <strong>%" +"(counter)s</strong> more\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/question.html:353 +#, python-format +msgid "" +"\n" +" see <strong>one</" +"strong> more comment\n" +" " +msgid_plural "" +"\n" +" see <strong>%" +"(counter)s</strong> more comments\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/question.html:366 +msgid "comments" +msgstr "" + +#: templates/question.html:386 templates/question.html.py:389 +msgid "Notify me once a day when there are any new answers" +msgstr "" + +#: templates/question.html:392 +msgid "Notify me weekly when there are any new answers" +msgstr "" + +#: templates/question.html:397 +#, python-format +msgid "" +"\n" +" You can always adjust frequency of email updates from your %" +"(profile_url)s\n" +" " +msgstr "" -#: templates/question.html:453 +#: templates/question.html:404 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" + +#: templates/question.html:415 msgid "Your answer" -msgstr "Tu respuesta" +msgstr "" -#: templates/question.html:456 +#: templates/question.html:417 +msgid "Be the first one to answer this question!" +msgstr "" + +#: templates/question.html:423 msgid "you can answer anonymously and then login" -msgstr "puedes responder de forma anónima y luego ingresar" +msgstr "" -#: templates/question.html:479 -msgid "Answer the question" -msgstr "Responde la pregunta" +#: templates/question.html:427 +msgid "answer your own question only to give an answer" +msgstr "" -#: templates/question.html:481 -msgid "Notify me daily if there are any new answers." -msgstr "Notificarme diariamente si hay nuevas respuestas." +#: templates/question.html:429 +msgid "please only give an answer, no discussions" +msgstr "" -#: templates/question.html:483 -msgid "once you sign in you will be able to subscribe for any updates here" +#: templates/question.html:465 +msgid "Login/Signup to Post Your Answer" +msgstr "" + +#: templates/question.html:468 +msgid "Answer Your Own Question" msgstr "" -"una vez que hayas ingresado podrás suscribirte a cualquiera de las " -"actualizaciones aquí." -#: templates/question.html:494 +#: templates/question.html:470 +msgid "Answer the question" +msgstr "" + +#: templates/question.html:483 msgid "Question tags" -msgstr "Tags de la pregunta" +msgstr "" -#: templates/question.html:504 +#: templates/question.html:493 msgid "question asked" -msgstr "pregunta preguntada" - -#: templates/question.html:504 templates/question.html.py:510 -#: templates/user_info.html:51 -msgid "ago" -msgstr " atras" +msgstr "" -#: templates/question.html:507 +#: templates/question.html:496 msgid "question was seen" -msgstr "la pregunta fue vista" +msgstr "" -#: templates/question.html:507 +#: templates/question.html:496 msgid "times" -msgstr "veces" +msgstr "" -#: templates/question.html:510 +#: templates/question.html:499 msgid "last updated" -msgstr "última vez actualizada" +msgstr "" -#: templates/question.html:515 +#: templates/question.html:504 msgid "Related questions" -msgstr "Preguntas relacionadas" +msgstr "" -#: templates/question_edit.html:4 templates/question_edit.html.py:65 +#: templates/question_edit.html:5 templates/question_edit.html.py:66 msgid "Edit question" -msgstr "Editar pregunta" +msgstr "" #: templates/question_edit_tips.html:4 msgid "question tips" -msgstr "sugerencias sobre pregunta" +msgstr "" #: templates/question_edit_tips.html:7 msgid "please ask a relevant question" -msgstr "por favor hacer preguntas relevantes" +msgstr "" #: templates/question_edit_tips.html:10 msgid "please try provide enough details" -msgstr "intente proveer suficientes detalles" +msgstr "" -#: templates/question_retag.html:3 templates/question_retag.html.py:52 +#: templates/question_retag.html:4 templates/question_retag.html.py:53 msgid "Change tags" -msgstr "Cambiar etiquetas" +msgstr "" -#: templates/question_retag.html:39 +#: templates/question_retag.html:40 msgid "up to 5 tags, less than 20 characters each" -msgstr "hasta 5 etiquetas, menos de 20 caracteres cada una" +msgstr "" -#: templates/question_retag.html:82 +#: templates/question_retag.html:83 msgid "Why use and modify tags?" -msgstr "¿Porqué usar y modificar etiquetas?" +msgstr "" -#: templates/question_retag.html:85 +#: templates/question_retag.html:86 msgid "tags help us keep Questions organized" -msgstr "las etiquetas nos permiten mantener las Preguntas organizadas" +msgstr "" -#: templates/question_retag.html:91 +#: templates/question_retag.html:94 msgid "tag editors receive special awards from the community" msgstr "" -"los editores de etiquetas reciben distinciones especiales de la comunidad" -#: templates/questions.html:23 +#: templates/questions.html:28 templates/questions.html.py:32 msgid "Found by tags" -msgstr "Encontradas por etiqueta" +msgstr "" -#: templates/questions.html:23 +#: templates/questions.html:28 templates/questions.html.py:38 msgid "Found by title" -msgstr "Encontradas por título" +msgstr "" -#: templates/questions.html:23 +#: templates/questions.html:28 templates/questions.html.py:44 msgid "All questions" -msgstr "Todas las preguntas" +msgstr "" + +#: templates/questions.html:36 +msgid "Search results" +msgstr "" + +#: templates/questions.html:42 templates/unanswered.html:8 +#: templates/unanswered.html.py:19 +msgid "Unanswered questions" +msgstr "" -#: templates/questions.html:25 templates/unanswered.html:20 +#: templates/questions.html:51 templates/unanswered.html:21 msgid "most recently asked questions" -msgstr "preguntas hechas más recientemente" +msgstr "" -#: templates/questions.html:26 -msgid "most recently updated questions" -msgstr "preguntas actualizadas más recientemente" +#: templates/questions.html:143 +msgid "Category: " +msgstr "" -#: templates/questions.html:26 -msgid "active" -msgstr "actividad" +#: templates/questions.html:149 +msgid "Did not find anything?" +msgstr "" + +#: templates/questions.html:152 +msgid "Did not find what you were looking for?" +msgstr "" + +#: templates/questions.html:154 +msgid "Please, post your question!" +msgstr "" -#: templates/questions.html:109 +#: templates/questions.html:169 #, python-format msgid "" "\n" @@ -1889,15 +2300,9 @@ msgid_plural "" "\t\t\thave total %(q_num)s questions tagged %(tagname)s\n" "\t\t\t" msgstr[0] "" -"\n" -"\t\t\ttiene un total de %(q_num)s preguntas etiquetadas con %(tagname)s\n" -"\t\t\t" msgstr[1] "" -"\n" -"\t\t\ttiene un total de %(q_num)s preguntas etiquetadas con %(tagname)s\n" -"\t\t\t" -#: templates/questions.html:116 +#: templates/questions.html:176 #, python-format msgid "" "\n" @@ -1908,16 +2313,10 @@ msgid_plural "" "\t\t\t\thave total %(q_num)s questions containing %(searchtitle)s\n" "\t\t\t\t" msgstr[0] "" -"\n" -"\t\t\thay un total de %(q_num)s preguntas que contienen %(searchtitle)s\n" -"\t\t\t" msgstr[1] "" -"\n" -"\t\t\thay un total de %(q_num)s pregunta que contiene %(searchtitle)s\n" -"\t\t\t" -#: templates/questions.html:122 -#, fuzzy, python-format +#: templates/questions.html:182 +#, python-format msgid "" "\n" "\t\t\t\thave total %(q_num)s questions\n" @@ -1926,628 +2325,750 @@ msgid_plural "" "\n" "\t\t\t\thave total %(q_num)s questions\n" "\t\t\t\t" -msgstr[0] "ver preguntas etiquetadas '%(tagname)s'" -msgstr[1] "ver pregunta etiquetada '%(tagname)s'" +msgstr[0] "" +msgstr[1] "" + +#: templates/questions.html:191 +#, python-format +msgid "" +"\n" +" have total %(q_num)s questions tagged %(tagname)s\n" +" " +msgid_plural "" +"\n" +" have total %(q_num)s questions tagged %(tagname)s\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/questions.html:199 +#, python-format +msgid "" +"\n" +" have total %(q_num)s questions containing %(searchtitle)" +"s in full text\n" +" " +msgid_plural "" +"\n" +" have total %(q_num)s questions containing %(searchtitle)" +"s in full text\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/questions.html:205 +#, python-format +msgid "" +"\n" +" have total %(q_num)s questions containing %(searchtitle)" +"s\n" +" " +msgid_plural "" +"\n" +" have total %(q_num)s questions containing %(searchtitle)" +"s\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/questions.html:213 +#, python-format +msgid "" +"\n" +" have total %(q_num)s unanswered questions\n" +" " +msgid_plural "" +"\n" +" have total %(q_num)s unanswered questions\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/questions.html:219 +#, python-format +msgid "" +"\n" +" have total %(q_num)s questions\n" +" " +msgid_plural "" +"\n" +" have total %(q_num)s questions\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/questions.html:131 +#: templates/questions.html:230 msgid "latest questions info" -msgstr "<strong>Más recientes</strong> preguntas son mostradas primero." +msgstr "" -#: templates/questions.html:135 +#: templates/questions.html:234 msgid "Questions are sorted by the <strong>time of last update</strong>." msgstr "" -"Las preguntas estan ordenadas por <strong>fecha de último update</strong>." -#: templates/questions.html:136 +#: templates/questions.html:235 msgid "Most recently answered ones are shown first." -msgstr "Las más recientemente respondidas son mostradas primero." +msgstr "" -#: templates/questions.html:140 +#: templates/questions.html:239 msgid "Questions sorted by <strong>number of responses</strong>." -msgstr "Preguntas ordenadas por <strong>número de respuestas</strong>." +msgstr "" -#: templates/questions.html:141 +#: templates/questions.html:240 msgid "Most answered questions are shown first." -msgstr "Preguntas más respondidas aparecen primero." +msgstr "" -#: templates/questions.html:145 +#: templates/questions.html:244 msgid "Questions are sorted by the <strong>number of votes</strong>." -msgstr "Las preguntas son ordenadas por el <strong>número de votos</strong>." +msgstr "" -#: templates/questions.html:146 +#: templates/questions.html:245 msgid "Most voted questions are shown first." -msgstr "Las preguntas más votadas son mostradas primero." +msgstr "" -#: templates/questions.html:153 templates/unanswered.html:102 +#: templates/questions.html:253 templates/unanswered.html:118 msgid "Related tags" -msgstr "Etiquetas relacionadas" +msgstr "" + +#: templates/questions.html:263 templates/tag_selector.html:10 +#: templates/tag_selector.html.py:27 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "" #: templates/reopen.html:6 templates/reopen.html.py:16 msgid "Reopen question" -msgstr "Re-abrir pregunta" +msgstr "" #: templates/reopen.html:19 msgid "Open the previously closed question" -msgstr "Abrir pregunta previamente cerrada" +msgstr "" #: templates/reopen.html:22 msgid "The question was closed for the following reason " -msgstr "La pregunta fue cerrada por el siguiente motivo " +msgstr "" #: templates/reopen.html:22 msgid "reason - leave blank in english" -msgstr "razón - " +msgstr "" #: templates/reopen.html:22 msgid "on " -msgstr "el " +msgstr "" #: templates/reopen.html:22 msgid "date closed" -msgstr "fecha cerrada" +msgstr "" #: templates/reopen.html:29 msgid "Reopen this question" -msgstr "Re-abrir esta pregunta" +msgstr "" -#: templates/revisions_answer.html:7 templates/revisions_answer.html.py:36 -#: templates/revisions_question.html:8 templates/revisions_question.html:36 +#: templates/revisions_answer.html:7 templates/revisions_answer.html.py:38 +#: templates/revisions_question.html:8 templates/revisions_question.html:38 msgid "Revision history" -msgstr "Historial de revisiones" +msgstr "" + +#: templates/revisions_answer.html:50 templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "" + +#: templates/tag_selector.html:4 +msgid "Interesting tags" +msgstr "" + +#: templates/tag_selector.html:14 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "" + +#: templates/tag_selector.html:20 templates/tag_selector.html.py:37 +msgid "Add" +msgstr "" + +#: templates/tag_selector.html:21 +msgid "Ignored tags" +msgstr "" + +#: templates/tag_selector.html:31 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "" + +#: templates/tag_selector.html:40 +msgid "keep ingored questions hidden" +msgstr "" #: templates/tags.html:6 templates/tags.html.py:30 msgid "Tag list" -msgstr "Lista de etiquetas" +msgstr "" #: templates/tags.html:32 msgid "sorted alphabetically" -msgstr "ordenar alfabéticamente" +msgstr "" #: templates/tags.html:32 msgid "by name" -msgstr "por nombre" +msgstr "" #: templates/tags.html:33 msgid "sorted by frequency of tag use" -msgstr "ordenar por frecuencia de uso de la etiqueta" +msgstr "" #: templates/tags.html:33 msgid "by popularity" -msgstr "por popularidad" +msgstr "" #: templates/tags.html:39 msgid "All tags matching query" -msgstr "Todas las etiquetas que coincidan con la busqueda" +msgstr "" #: templates/tags.html:39 msgid "all tags - make this empty in english" -msgstr "todas las tags" +msgstr "" #: templates/tags.html:42 msgid "Nothing found" -msgstr "Nada encontrado" - -#: templates/unanswered.html:7 templates/unanswered.html.py:18 -msgid "Unanswered questions" -msgstr "Preguntas sin respuesta" +msgstr "" -#: templates/unanswered.html:97 +#: templates/unanswered.html:114 #, python-format msgid "have %(num_q)s unanswered questions" msgstr "" -"<div class=\"questions-count\">%(num_q)s</div> preguntas <strong>sin " -"respuesta</strong> " #: templates/user_edit.html:6 msgid "Edit user profile" -msgstr "Editar perfil de usuario" +msgstr "" #: templates/user_edit.html:19 msgid "edit profile" -msgstr "editar perfil" +msgstr "" #: templates/user_edit.html:31 msgid "image associated with your email address" -msgstr "imagen asociada con tu email" +msgstr "" #: templates/user_edit.html:31 -msgid "avatar" -msgstr "avatar" +#, python-format +msgid "avatar, see %(gravatar_faq_url)s" +msgstr "" -#: templates/user_edit.html:36 templates/user_info.html:31 +#: templates/user_edit.html:36 templates/user_info.html:56 msgid "Registered user" -msgstr "Usuario registrado" +msgstr "" -#: templates/user_edit.html:82 +#: templates/user_edit.html:86 templates/user_email_subscriptions.html:23 msgid "Update" -msgstr "Actualización" +msgstr "" + +#: templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "" -#: templates/user_info.html:34 +#: templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" + +#: templates/user_email_subscriptions.html:24 +msgid "Stop sending email" +msgstr "" + +#: templates/user_info.html:22 +msgid "karma" +msgstr "" + +#: templates/user_info.html:32 +msgid "Moderate this user" +msgstr "" + +#: templates/user_info.html:45 msgid "update profile" -msgstr "actualizar perfil de usuario" +msgstr "" -#: templates/user_info.html:40 +#: templates/user_info.html:60 msgid "real name" -msgstr "nombre real" +msgstr "" -#: templates/user_info.html:45 +#: templates/user_info.html:65 msgid "member for" -msgstr "miembro de" +msgstr "" -#: templates/user_info.html:50 +#: templates/user_info.html:70 msgid "last seen" -msgstr "última vez visto" +msgstr "" -#: templates/user_info.html:56 +#: templates/user_info.html:76 msgid "user website" -msgstr "sitio web del usuario" +msgstr "" -#: templates/user_info.html:62 +#: templates/user_info.html:82 msgid "location" -msgstr "ubicación" +msgstr "" -#: templates/user_info.html:69 +#: templates/user_info.html:89 msgid "age" -msgstr "edad" +msgstr "" -#: templates/user_info.html:70 +#: templates/user_info.html:90 msgid "age unit" -msgstr "unidad de edad" +msgstr "" -#: templates/user_info.html:76 +#: templates/user_info.html:96 msgid "todays unused votes" -msgstr "votos de hoy no usados" +msgstr "" -#: templates/user_info.html:77 +#: templates/user_info.html:97 msgid "votes left" -msgstr "votos restantes" - -#: templates/user_preferences.html:10 -msgid "Connect with Twitter" -msgstr "Conectar con Twitter" - -#: templates/user_preferences.html:13 -msgid "Twitter account name:" -msgstr "Nombre de usuario en Twitter:" - -#: templates/user_preferences.html:15 -msgid "Twitter password:" -msgstr "Contraseña de Twitter:" - -#: templates/user_preferences.html:17 -msgid "Send my Questions to Twitter" -msgstr "Enviar mis preguntas a Twitter" - -#: templates/user_preferences.html:18 -msgid "Send my Answers to Twitter" -msgstr "Enviar mis respuestas a Twitter" +msgstr "" -#: templates/user_preferences.html:19 -msgid "Save" -msgstr "Guardar" +#: templates/user_stats.html:12 +#, python-format +msgid "" +"\n" +" <span class=\"count\">1</span> Question\n" +" " +msgid_plural "" +"\n" +" <span class=\"count\">%(counter)s</span> Questions\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/user_stats.html:16 -msgid "User questions" -msgstr "Preguntas del usuario" +#: templates/user_stats.html:23 +#, python-format +msgid "" +"\n" +" <span class=\"count\">1</span> Answer\n" +" " +msgid_plural "" +"\n" +" <span class=\"count\">%(counter)s</span> Answers\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/user_stats.html:38 +#: templates/user_stats.html:36 #, python-format msgid "the answer has been voted for %(vote_count)s times" -msgstr "la respuesta ha sido votada %(vote_count)s veces" +msgstr "" -#: templates/user_stats.html:38 +#: templates/user_stats.html:36 msgid "this answer has been selected as correct" -msgstr "esta respuesta ha sido seleccionada como correcta" +msgstr "" #: templates/user_stats.html:46 #, python-format -msgid "the answer has been commented %(comment_count)s times" -msgstr "la respuesta ha sido comentada %(comment_count)s veces" +msgid "" +"\n" +" (one comment)\n" +" " +msgid_plural "" +"\n" +" the answer has been commented %(comment_count)s times\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/user_stats.html:61 +#, python-format +msgid "" +"\n" +" <span class=\"count\">1</span> Vote\n" +" " +msgid_plural "" +"\n" +" <span class=\"count\">%(cnt)s</span> Votes\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/user_stats.html:60 -msgid "votes total" -msgstr "votos totales" +#: templates/user_stats.html:72 +msgid "thumb up" +msgstr "" -#: templates/user_stats.html:69 +#: templates/user_stats.html:73 msgid "user has voted up this many times" -msgstr "el usuario ha votado positivo esta cantidad de veces" +msgstr "" -#: templates/user_stats.html:74 +#: templates/user_stats.html:77 +msgid "thumb down" +msgstr "" + +#: templates/user_stats.html:78 msgid "user voted down this many times" -msgstr "el usuario voto negativo esta cantidad de veces" +msgstr "" #: templates/user_stats.html:87 -msgid "Tags" -msgstr "Etiquetas" +#, python-format +msgid "" +"\n" +" <span class=\"count\">1</span> Tag\n" +" " +msgid_plural "" +"\n" +" <span class=\"count\">%(counter)s</span> Tags\n" +" " +msgstr[0] "" +msgstr[1] "" -#: templates/user_stats.html:97 +#: templates/user_stats.html:100 #, python-format -msgid "see other questions tagged '%(tag)s' " -msgstr "ver otras preguntas etiqueteadas '%(tag)s'" +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" + +#: templates/user_stats.html:115 +#, python-format +msgid "" +"\n" +" <span class=\"count\">1</span> Badge\n" +" " +msgid_plural "" +"\n" +" <span class=\"count\">%(counter)s</span> Badges\n" +" " +msgstr[0] "" +msgstr[1] "" #: templates/user_tabs.html:7 msgid "User profile" -msgstr "Perfil de usuario" +msgstr "" #: templates/user_tabs.html:16 msgid "graph of user reputation" -msgstr "gráfica de la reputación del usuario" +msgstr "" #: templates/user_tabs.html:17 msgid "reputation history" -msgstr "historial de reputación" +msgstr "" + +#: templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "" #: templates/user_tabs.html:24 msgid "favorites" -msgstr "favoritos" - -#: templates/user_tabs.html:28 -msgid "settings" -msgstr "preferencias" +msgstr "" #: templates/users.html:6 templates/users.html.py:24 msgid "Users" -msgstr "Usuarios" +msgstr "" #: templates/users.html:27 msgid "recent" -msgstr "reciente" +msgstr "" #: templates/users.html:28 msgid "oldest" -msgstr "más viejo" +msgstr "" #: templates/users.html:29 msgid "by username" -msgstr "por nombre de usuario" +msgstr "" #: templates/users.html:35 #, python-format msgid "users matching query %(suser)s:" -msgstr "usuarios que coincidan con la busqueda %(suser)s:" +msgstr "" #: templates/users.html:39 msgid "Nothing found." -msgstr "Nada encontrado." +msgstr "" #: templates/users_questions.html:11 msgid "this questions was selected as favorite" -msgstr "esta pregunta ha sido seleccionada como favorita" +msgstr "" + +#: templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "" -#: templates/users_questions.html:33 +#: templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "" + +#: templates/users_questions.html:34 msgid "this answer has been accepted to be correct" -msgstr "esta respuesta ha sido aceptada como correcta" +msgstr "" -#: templates/authopenid/changeemail.html:7 -#: templates/authopenid/changeemail.html:33 +#: templates/authopenid/changeemail.html:3 +#: templates/authopenid/changeemail.html:9 +#: templates/authopenid/changeemail.html:38 msgid "Change email" -msgstr "Cambiar dirección email" +msgstr "" -#: templates/authopenid/changeemail.html:10 +#: templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "" + +#: templates/authopenid/changeemail.html:16 #, python-format msgid "change %(email)s info" -msgstr "Cambiar información del correo electrónico %(email)s" +msgstr "" -#: templates/authopenid/changeemail.html:13 -#: templates/authopenid/changeopenid.html:14 -#: templates/authopenid/changepw.html:19 templates/authopenid/delete.html:15 -#: templates/authopenid/delete.html:25 -msgid "Please correct errors below:" -msgstr "Por favor corrija los errores debajo: " +#: templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" -#: templates/authopenid/changeemail.html:30 +#: templates/authopenid/changeemail.html:31 msgid "Your new Email" -msgstr "Tu nuevo Email" +msgstr "" #: templates/authopenid/changeemail.html:31 -#: templates/authopenid/signin.html:136 -msgid "Password" -msgstr "Contraseña" +msgid "Your Email" +msgstr "" -#: templates/authopenid/changeemail.html:42 -#, fuzzy +#: templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "" + +#: templates/authopenid/changeemail.html:49 msgid "Validate email" -msgstr "Cambiar dirección email" +msgstr "" -#: templates/authopenid/changeemail.html:45 +#: templates/authopenid/changeemail.html:52 #, python-format -msgid "validate %(email)s info" -msgstr "validar información de %(email)s " +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" -#: templates/authopenid/changeemail.html:50 +#: templates/authopenid/changeemail.html:57 msgid "Email not changed" -msgstr "Email no modificado." +msgstr "" -#: templates/authopenid/changeemail.html:53 +#: templates/authopenid/changeemail.html:60 #, python-format -msgid "old %(email)s kept" -msgstr "se ha conservado el viejo email %(email)s " +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" -#: templates/authopenid/changeemail.html:58 +#: templates/authopenid/changeemail.html:65 msgid "Email changed" -msgstr "Email modificado." +msgstr "" -#: templates/authopenid/changeemail.html:61 +#: templates/authopenid/changeemail.html:68 #, python-format msgid "your current %(email)s can be used for this" -msgstr "tu email actual %(email)s puede ser usado para esto" +msgstr "" -#: templates/authopenid/changeemail.html:66 +#: templates/authopenid/changeemail.html:73 msgid "Email verified" -msgstr "Email verificado" +msgstr "" -#: templates/authopenid/changeemail.html:69 +#: templates/authopenid/changeemail.html:76 msgid "thanks for verifying email" -msgstr "gracias por verificar su correo" +msgstr "" -#: templates/authopenid/changeemail.html:74 +#: templates/authopenid/changeemail.html:81 msgid "email key not sent" -msgstr "llave de correo no enviada" +msgstr "" -#: templates/authopenid/changeemail.html:77 +#: templates/authopenid/changeemail.html:84 #, python-format msgid "email key not sent %(email)s change email here %(change_link)s" -msgstr "email no enviado %(email)s cambiar email aquí %(change_link)s" +msgstr "" + +#: templates/authopenid/changeopenid.html:4 +#: templates/authopenid/changeopenid.html:30 +#: templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "" #: templates/authopenid/changeopenid.html:8 msgid "Account: change OpenID URL" -msgstr "Cuenta: cambiar la URL de OpenID" +msgstr "" #: templates/authopenid/changeopenid.html:12 msgid "" "This is where you can change your OpenID URL. Make sure you remember it!" -msgstr "Aquí es donde puedes cambiar tu OpenID URL. Asegurate de recordarla!" +msgstr "" + +#: templates/authopenid/changeopenid.html:14 +#: templates/authopenid/delete.html:14 templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" #: templates/authopenid/changeopenid.html:29 msgid "OpenID URL:" -msgstr "URL de OpenID:" +msgstr "" -#: templates/authopenid/changeopenid.html:30 -msgid "Change OpenID" -msgstr "Cambiar OpenID" +#: templates/authopenid/changepw.html:5 templates/authopenid/changepw.html:14 +#: templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "" -#: templates/authopenid/changepw.html:14 +#: templates/authopenid/changepw.html:7 msgid "Account: change password" -msgstr "Cuenta: cambiar contraseña" +msgstr "" -#: templates/authopenid/changepw.html:17 +#: templates/authopenid/changepw.html:8 msgid "This is where you can change your password. Make sure you remember it!" -msgstr "Aquí es donde puedes cambiar tu contraseña. Asegurate de recordarlo!" - -#: templates/authopenid/changepw.html:27 -msgid "Current password" -msgstr "Contraseña actual" - -#: templates/authopenid/changepw.html:28 -msgid "New password" -msgstr "Nueva contraseña" - -#: templates/authopenid/changepw.html:29 -msgid "New password again" -msgstr "Nueva contraseña nuevamente" - -#: templates/authopenid/changepw.html:30 templates/authopenid/settings.html:29 -msgid "Change password" -msgstr "Cambiar contraseña" +msgstr "" -#: templates/authopenid/complete.html:5 +#: templates/authopenid/complete.html:19 msgid "Connect your OpenID with this site" -msgstr "Vincular tu OpenID con este sitio" +msgstr "" -#: templates/authopenid/complete.html:8 +#: templates/authopenid/complete.html:22 msgid "Connect your OpenID with your account on this site" -msgstr "Vincular tu OpenID con tu cuenta en este sitio" +msgstr "" + +#: templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" + +#: templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" -#: templates/authopenid/complete.html:12 +#: templates/authopenid/complete.html:35 #, python-format -msgid "register new %(provider)s account info" -msgstr "Registrar una nueva cuenta %(provider)s." +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" -#: templates/authopenid/complete.html:14 +#: templates/authopenid/complete.html:40 msgid "This account already exists, please use another." -msgstr "Esta cuenta ya existe, por favor usar otra." +msgstr "" -#: templates/authopenid/complete.html:19 templates/authopenid/complete.html:32 -#: templates/authopenid/signin.html:120 +#: templates/authopenid/complete.html:55 msgid "Sorry, looks like we have some errors:" -msgstr "Ups, parece que hay errores:" +msgstr "" -#: templates/authopenid/complete.html:47 +#: templates/authopenid/complete.html:76 msgid "Screen name label" -msgstr "Nombre de Usuario" +msgstr "" -#: templates/authopenid/complete.html:48 +#: templates/authopenid/complete.html:83 msgid "Email address label" -msgstr "Su email (correo electrónico)" +msgstr "" + +#: templates/authopenid/complete.html:89 templates/authopenid/signup.html:15 +msgid "receive updates motivational blurb" +msgstr "" + +#: templates/authopenid/complete.html:93 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" -#: templates/authopenid/complete.html:49 +#: templates/authopenid/complete.html:95 msgid "create account" -msgstr "crear cuenta" +msgstr "" -#: templates/authopenid/complete.html:56 +#: templates/authopenid/complete.html:104 msgid "Existing account" -msgstr "Cuenta existente" +msgstr "" -#: templates/authopenid/complete.html:57 +#: templates/authopenid/complete.html:105 msgid "user name" -msgstr "nombre de usuario" +msgstr "" -#: templates/authopenid/complete.html:58 +#: templates/authopenid/complete.html:106 msgid "password" -msgstr "contraseña" - -#: templates/authopenid/complete.html:61 -msgid "Register" -msgstr "Registrarse" - -#: templates/authopenid/complete.html:62 templates/authopenid/signin.html:138 -msgid "Forgot your password?" -msgstr "¿Olvidaste tu contraseña?" - -#: templates/authopenid/confirm_email.txt:2 -msgid "Thank you for registering at our Q&A forum!" msgstr "" -#: templates/authopenid/confirm_email.txt:4 -msgid "Your account details are:" +#: templates/authopenid/complete.html:111 +msgid "Register" msgstr "" -#: templates/authopenid/confirm_email.txt:6 -#: templates/authopenid/sendpw_email.txt:7 -msgid "Username:" -msgstr "Nombre de usuario:" - -#: templates/authopenid/confirm_email.txt:7 -#: templates/authopenid/delete.html:20 -msgid "Password:" -msgstr "Contraseña" - -#: templates/authopenid/confirm_email.txt:9 -msgid "Please sign in here:" +#: templates/authopenid/complete.html:112 templates/authopenid/signin.html:140 +msgid "Forgot your password?" msgstr "" -#: templates/authopenid/confirm_email.txt:12 -#: templates/authopenid/email_validation.txt:14 -#: templates/authopenid/sendpw_email.txt:13 -msgid "" -"Sincerely,\n" -"Forum Administrator" +#: templates/authopenid/delete.html:4 templates/authopenid/settings.html:38 +msgid "Delete account" msgstr "" -#: templates/authopenid/delete.html:9 +#: templates/authopenid/delete.html:8 msgid "Account: delete account" -msgstr "Cuenta: borrar cuenta" +msgstr "" -#: templates/authopenid/delete.html:13 +#: templates/authopenid/delete.html:12 msgid "" "Note: After deleting your account, anyone will be able to register this " "username." msgstr "" -"Nota: Luego de borrar tu cuenta, cualquiera va a poder registrarse con este " -"nombre de usuario." -#: templates/authopenid/delete.html:17 +#: templates/authopenid/delete.html:16 msgid "Check confirm box, if you want delete your account." -msgstr "Marca caja de confirmación, si deseas borrar tu cuenta." +msgstr "" -#: templates/authopenid/delete.html:32 +#: templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "" + +#: templates/authopenid/delete.html:31 msgid "I am sure I want to delete my account." -msgstr "Estoy seguro que quiero borrar mi cuenta." +msgstr "" -#: templates/authopenid/delete.html:33 +#: templates/authopenid/delete.html:32 msgid "Password/OpenID URL" -msgstr "Contraseña/OpenID URL" +msgstr "" -#: templates/authopenid/delete.html:33 +#: templates/authopenid/delete.html:32 msgid "(required for your security)" -msgstr "(requerido por tu seguridad)" - -#: templates/authopenid/delete.html:35 -msgid "Delete account permanently" -msgstr "Borrar la cuenta de forma permanente" - -#: templates/authopenid/email_validation.txt:2 -msgid "Greetings from the Q&A forum" msgstr "" -#: templates/authopenid/email_validation.txt:4 -msgid "To make use of the Forum, please follow the link below:" +#: templates/authopenid/delete.html:34 +msgid "Delete account permanently" msgstr "" -#: templates/authopenid/email_validation.txt:8 -msgid "Following the link above will help us verify your email address." +#: templates/authopenid/external_legacy_login_info.html:4 +#: templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" msgstr "" -#: templates/authopenid/email_validation.txt:10 -msgid "" -"If you beleive that this message was sent in mistake - \n" -"no further action is needed. Just ingore this email, we apologize\n" -"for any inconvenience" +#: templates/authopenid/external_legacy_login_info.html:17 +msgid "how to login with password through external login website" msgstr "" -#: templates/authopenid/sendpw.html:4 templates/authopenid/sendpw.html.py:8 +#: templates/authopenid/sendpw.html:4 templates/authopenid/sendpw.html.py:7 msgid "Send new password" -msgstr "Enviar nueva contraseña" - -#: templates/authopenid/sendpw.html:12 -msgid "Lost your password? No problem - here you can reset it." -msgstr "¿Haz perdido tu contraseña? No hay problema - aquí puedes re-crearla." - -#: templates/authopenid/sendpw.html:13 -msgid "" -"Please enter your username below and new password will be sent to your " -"registered e-mail" msgstr "" -"Por favor, ingresa tu nombre de usuario y una nueva contraseña será enviada " -"a la dirección de email registrada." - -#: templates/authopenid/sendpw.html:28 -msgid "User name" -msgstr "Nombre de usuario" - -#: templates/authopenid/sendpw.html:30 -msgid "Reset password" -msgstr "Re-crear contraseña" - -#: templates/authopenid/sendpw.html:30 -msgid "return to login" -msgstr "volver a 'Ingresar'" -#: templates/authopenid/sendpw.html:33 -msgid "" -"Note: your new password will be activated only after you click the " -"activation link in the email message" +#: templates/authopenid/sendpw.html:10 +msgid "password recovery information" msgstr "" -"Nota: tu nueva contraseña solo será activada luego de que hagas click en el " -"link de activación en el email enviado." -#: templates/authopenid/sendpw_email.txt:2 -#, python-format -msgid "" -"Someone has requested to reset your password on %(site_url)s.\n" -"If it were not you, it is safe to ignore this email." +#: templates/authopenid/sendpw.html:21 +msgid "Reset password" msgstr "" -#: templates/authopenid/sendpw_email.txt:5 -msgid "Your new account details are:" +#: templates/authopenid/sendpw.html:22 +msgid "return to login" msgstr "" -#: templates/authopenid/sendpw_email.txt:8 -#, fuzzy -msgid "New password:" -msgstr "Nueva contraseña:" - -#: templates/authopenid/sendpw_email.txt:10 -msgid "To confirm that you wanted to reset your password please visit:" +#: templates/authopenid/settings.html:4 +msgid "Account functions" msgstr "" #: templates/authopenid/settings.html:30 msgid "Give your account a new password." -msgstr "Crea una nueva contraseña para tu cuenta." +msgstr "" #: templates/authopenid/settings.html:31 msgid "Change email " -msgstr "Cambiar email " +msgstr "" #: templates/authopenid/settings.html:32 msgid "Add or update the email address associated with your account." -msgstr "Agrega o actualiza el email asociado a tu cuenta." +msgstr "" #: templates/authopenid/settings.html:35 msgid "Change openid associated to your account" -msgstr "Cambia el OpenID asociado a tu cuenta" - -#: templates/authopenid/settings.html:38 -msgid "Delete account" -msgstr "Eliminar cuenta" +msgstr "" #: templates/authopenid/settings.html:39 msgid "Erase your username and all your data from website" -msgstr "Eliminar tu nombre de usuario y toda tu información del sitio" +msgstr "" -#: templates/authopenid/signin.html:4 templates/authopenid/signin.html:21 +#: templates/authopenid/signin.html:5 templates/authopenid/signin.html:21 msgid "User login" -msgstr "Ingreso de usuario" +msgstr "" #: templates/authopenid/signin.html:28 #, python-format @@ -2557,10 +3078,6 @@ msgid "" "log in\n" " " msgstr "" -"\n" -" Tu respuesta a %(title)s %(summary)s será publicada una vez " -"que ingreses \n" -" " #: templates/authopenid/signin.html:35 #, python-format @@ -2569,127 +3086,85 @@ msgid "" " %(title)s %(summary)s will be posted once you log in\n" " " msgstr "" -"Tu pregunta \n" -" %(title)s %(summary)s será publicada una vez que ingreses\n" -" " -#: templates/authopenid/signin.html:40 +#: templates/authopenid/signin.html:42 msgid "Click to sign in through any of these services." -msgstr "Clickea para entrar por cualquiera de estos servicios." +msgstr "" -#: templates/authopenid/signin.html:103 +#: templates/authopenid/signin.html:117 msgid "Enter your <span id=\"enter_your_what\">Provider user name</span>" -msgstr "Ingresa tu <span id=\"enter_your_what\">nombre de usuario</span>" +msgstr "" -#: templates/authopenid/signin.html:110 +#: templates/authopenid/signin.html:124 msgid "" "Enter your <a class=\"openid_logo\" href=\"http://openid.net\">OpenID</a> " "web address" msgstr "" -"Ingresa tu dirección (URL) de <a class=\"openid_logo\" href=\"http://openid." -"net\">OpenID</a>" -#: templates/authopenid/signin.html:112 templates/authopenid/signin.html:137 +#: templates/authopenid/signin.html:126 templates/authopenid/signin.html:138 msgid "Login" -msgstr "Ingresar" +msgstr "" -#: templates/authopenid/signin.html:116 -msgid "we support two login modes" -msgstr "soportamos dos tipos de ingreso" +#: templates/authopenid/signin.html:129 +msgid "Enter your login name and password" +msgstr "" -#: templates/authopenid/signin.html:134 -msgid "Use login name and password" -msgstr "Nombre de usuario y contraseña" +#: templates/authopenid/signin.html:133 +msgid "Login name" +msgstr "" #: templates/authopenid/signin.html:135 -msgid "Login name" -msgstr "Nombre de usuario" +msgid "Password" +msgstr "" #: templates/authopenid/signin.html:139 -msgid "Create new account" -msgstr "Crear cuenta nueva" +msgid "Create account" +msgstr "" -#: templates/authopenid/signin.html:148 +#: templates/authopenid/signin.html:149 msgid "Why use OpenID?" -msgstr "¿Porqué usar OpenID?" +msgstr "" -#: templates/authopenid/signin.html:151 +#: templates/authopenid/signin.html:152 msgid "with openid it is easier" -msgstr "Con OpenID no necesitas crear un nuevo nombre de usuario y contraseña." +msgstr "" -#: templates/authopenid/signin.html:154 +#: templates/authopenid/signin.html:155 msgid "reuse openid" msgstr "" -"Puedes de forma segura re-usar el mismo nombre de usuario para todos los " -"sitios que acepten OpenID." -#: templates/authopenid/signin.html:157 +#: templates/authopenid/signin.html:158 msgid "openid is widely adopted" msgstr "" -"OpenID es extensamente usado. Hay más de 160,000,000 cuentas de OpenID en " -"uso en el mundo. Mas de 10,000 sitios aceptan OpenID." -#: templates/authopenid/signin.html:160 +#: templates/authopenid/signin.html:161 msgid "openid is supported open standard" msgstr "" -"OpenID es basado en un standard abierto, apoyado por muchas organizaciones." -#: templates/authopenid/signin.html:165 +#: templates/authopenid/signin.html:166 msgid "Find out more" -msgstr "Averigua más" +msgstr "" -#: templates/authopenid/signin.html:166 +#: templates/authopenid/signin.html:167 msgid "Get OpenID" -msgstr "Adquiere una OpenID" +msgstr "" -#: templates/authopenid/signup.html:4 templates/authopenid/signup.html.py:8 +#: templates/authopenid/signup.html:4 msgid "Signup" -msgstr "Registrate" +msgstr "" -#: templates/authopenid/signup.html:12 -msgid "" -"We support two types of user registration: conventional username/password, " -"and" +#: templates/authopenid/signup.html:8 +msgid "Create login name and password" msgstr "" -"Soportamos dos formas de registro de usuario: convencional usuario/" -"contraseña, y" -#: templates/authopenid/signup.html:12 -msgid "the OpenID method" -msgstr "OpenID" +#: templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" #: templates/authopenid/signup.html:17 -msgid "Sorry, looks like we have some errors" -msgstr "Ups, parece que hay errores." - -#: templates/authopenid/signup.html:35 -msgid "Conventional registration" -msgstr "Registro clásico" - -#: templates/authopenid/signup.html:36 -msgid "choose a user name" -msgstr "elije un nombre de usuario" - -#: templates/authopenid/signup.html:42 -msgid "back to login" -msgstr "volver al ingreso de usuario" - -#: templates/authopenid/signup.html:46 -msgid "Register with your OpenID" -msgstr "Registrate con tu OpenID" - -#: templates/authopenid/signup.html:49 -msgid "Login with your OpenID" -msgstr "Ingresar con tu OpenID" - -#~ msgid "site title" -#~ msgstr "Preguntalo.com.uy" - -#~ msgid "Have a total of" -#~ msgstr "Hay un total de" - -#~ msgid "/account/" -#~ msgstr "/cuenta/" +msgid "Create Account" +msgstr "" -#~ msgid "content/" -#~ msgstr "contenido/" +#: templates/authopenid/signup.html:19 +msgid "return to OpenID login" +msgstr "" diff --git a/middleware/__init__.py~HEAD b/middleware/__init__.py~HEAD new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/middleware/__init__.py~HEAD @@ -1 +0,0 @@ -rm `find . -name '*.pyc'` diff --git a/session_messages/.svn/all-wcprops b/session_messages/.svn/all-wcprops new file mode 100644 index 00000000..2a15b353 --- /dev/null +++ b/session_messages/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 38 +/svn/!svn/ver/5/trunk/session_messages +END +__init__.py +K 25 +svn:wc:ra_dav:version-url +V 50 +/svn/!svn/ver/5/trunk/session_messages/__init__.py +END +models.py +K 25 +svn:wc:ra_dav:version-url +V 48 +/svn/!svn/ver/2/trunk/session_messages/models.py +END +context_processors.py +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/2/trunk/session_messages/context_processors.py +END diff --git a/session_messages/.svn/dir-prop-base b/session_messages/.svn/dir-prop-base new file mode 100644 index 00000000..4cc643b7 --- /dev/null +++ b/session_messages/.svn/dir-prop-base @@ -0,0 +1,6 @@ +K 10 +svn:ignore +V 6 +*.pyc + +END diff --git a/session_messages/.svn/entries b/session_messages/.svn/entries new file mode 100644 index 00000000..67c0db8a --- /dev/null +++ b/session_messages/.svn/entries @@ -0,0 +1,64 @@ +8 + +dir +5 +http://django-session-messages.googlecode.com/svn/trunk/session_messages +http://django-session-messages.googlecode.com/svn + + + +2009-03-10T23:30:03.043791Z +5 +carl.j.meyer +has-props + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +b8288d2d-7354-0410-af5b-714f73743f4b + +__init__.py +file + + + + +2009-10-25T23:36:02.000000Z +89aa0f71c9973e4889e5fad0b4771a34 +2009-03-10T23:30:03.043791Z +5 +carl.j.meyer + +models.py +file + + + + +2009-10-25T23:36:02.000000Z +c5b4f274dbb06bc66a14f0c18c9115cd +2008-08-14T23:13:23.180432Z +2 +carl.j.meyer + +context_processors.py +file + + + + +2009-10-25T23:36:02.000000Z +24779c7e504d3f7f1918fdf3fe8096bc +2008-08-14T23:13:23.180432Z +2 +carl.j.meyer + diff --git a/session_messages/.svn/format b/session_messages/.svn/format new file mode 100644 index 00000000..45a4fb75 --- /dev/null +++ b/session_messages/.svn/format @@ -0,0 +1 @@ +8 diff --git a/session_messages/.svn/text-base/__init__.py.svn-base b/session_messages/.svn/text-base/__init__.py.svn-base new file mode 100644 index 00000000..0136c888 --- /dev/null +++ b/session_messages/.svn/text-base/__init__.py.svn-base @@ -0,0 +1,36 @@ +""" +Lightweight session-based messaging system. + +Time-stamp: <2009-03-10 19:22:29 carljm __init__.py> + +""" +VERSION = (0, 1, 'pre') + +def create_message (request, message): + """ + Create a message in the current session. + + """ + assert hasattr(request, 'session'), "django-session-messages requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." + + try: + request.session['messages'].append(message) + except KeyError: + request.session['messages'] = [message] + +def get_and_delete_messages (request, include_auth=False): + """ + Get and delete all messages for current session. + + Optionally also fetches user messages from django.contrib.auth. + + """ + assert hasattr(request, 'session'), "django-session-messages requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." + + messages = request.session.pop('messages', []) + + if include_auth and request.user.is_authenticated(): + messages.extend(request.user.get_and_delete_messages()) + + return messages + diff --git a/session_messages/.svn/text-base/context_processors.py.svn-base b/session_messages/.svn/text-base/context_processors.py.svn-base new file mode 100644 index 00000000..df9840fd --- /dev/null +++ b/session_messages/.svn/text-base/context_processors.py.svn-base @@ -0,0 +1,48 @@ +""" +Context processor for lightweight session messages. + +Time-stamp: <2008-07-19 23:16:19 carljm context_processors.py> + +""" +from django.utils.encoding import StrAndUnicode + +from session_messages import get_and_delete_messages + +def session_messages (request): + """ + Returns session messages for the current session. + + """ + return { 'session_messages': LazyMessages(request) } + +class LazyMessages (StrAndUnicode): + """ + Lazy message container, so messages aren't actually retrieved from + session and deleted until the template asks for them. + + """ + def __init__(self, request): + self.request = request + + def __iter__(self): + return iter(self.messages) + + def __len__(self): + return len(self.messages) + + def __nonzero__(self): + return bool(self.messages) + + def __unicode__(self): + return unicode(self.messages) + + def __getitem__(self, *args, **kwargs): + return self.messages.__getitem__(*args, **kwargs) + + def _get_messages(self): + if hasattr(self, '_messages'): + return self._messages + self._messages = get_and_delete_messages(self.request) + return self._messages + messages = property(_get_messages) + diff --git a/session_messages/.svn/text-base/models.py.svn-base b/session_messages/.svn/text-base/models.py.svn-base new file mode 100644 index 00000000..b67ead6d --- /dev/null +++ b/session_messages/.svn/text-base/models.py.svn-base @@ -0,0 +1,3 @@ +""" +blank models.py +""" diff --git a/settings.py b/settings.py index 3ffc6d4f..775bda45 100755 --- a/settings.py +++ b/settings.py @@ -2,7 +2,6 @@ # Django settings for lanai project. import os.path import sys - SITE_ID = 1 ADMIN_MEDIA_PREFIX = '/forum/admin/media/' diff --git a/settings_local.py.dist b/settings_local.py.dist new file mode 100755 index 00000000..2251e58e --- /dev/null +++ b/settings_local.py.dist @@ -0,0 +1,107 @@ +# encoding:utf-8 +import os.path +from django.utils.translation import ugettext as _ + +SITE_SRC_ROOT = os.path.dirname(__file__) +LOG_FILENAME = 'django.lanai.log' + +#for logging +import logging +logging.basicConfig(filename=os.path.join(SITE_SRC_ROOT, 'log', LOG_FILENAME), level=logging.DEBUG,) +def check_local_setting(name, value): + local_vars = locals() + if name in local_vars and local_var[name] == value: + return True + else: + return False + +SITE_SRC_ROOT = os.path.dirname(__file__) +LOG_FILENAME = 'django.osqa.log' + +#for logging +import logging +logging.basicConfig( + filename=os.path.join(SITE_SRC_ROOT, 'log', LOG_FILENAME), + level=logging.DEBUG, + format='%(pathname)s TIME: %(asctime)s MSG: %(filename)s:%(funcName)s:%(lineno)d %(message)s', +) + +#ADMINS and MANAGERS +ADMINS = (('Forum Admin', 'forum@example.com'),) +MANAGERS = ADMINS + +#DEBUG SETTINGS +DEBUG = False +TEMPLATE_DEBUG = DEBUG +INTERNAL_IPS = ('127.0.0.1',) + +DATABASE_NAME = 'osqa' # Or path to database file if using sqlite3. +DATABASE_USER = '' # Not used with sqlite3. +DATABASE_PASSWORD = '' # Not used with sqlite3. +DATABASE_ENGINE = 'mysql' #mysql, etc +DATABASE_HOST = '' +DATABASE_PORT = '' + +#email server settings +SERVER_EMAIL = '' +DEFAULT_FROM_EMAIL = '' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_SUBJECT_PREFIX = '[OSQA] ' +EMAIL_HOST='osqa.net' +EMAIL_PORT='25' +EMAIL_USE_TLS=False + +FORUM_SCRIPT_ALIAS = '' #no leading slash, default = '' empty string + +#LOCALIZATIONS +TIME_ZONE = 'Asia/Chongqing Asia/Chungking' +# LANGUAGE_CODE = 'en-us' + +#OTHER SETTINGS +APP_COPYRIGHT = 'Copyright CNPROG.COM 2009' +APP_TITLE = u'OSQA: Open Source Q&A Forum' +APP_SHORT_NAME = u'OSQA' +APP_KEYWORDS = u'OSQA,CNPROG,forum,community' +APP_DESCRIPTION = u'Ask and answer questions.' +APP_INTRO = u'<p>Ask and answer questions, make the world better!</p>' +APP_COPYRIGHT = 'Copyright OSQA, 2009. Some rights reserved under creative commons license.' +LOGIN_URL = '/%s%s%s' % (FORUM_SCRIPT_ALIAS,'account/','signin/') +GREETING_URL = LOGIN_URL #may be url of "faq" page or "about", etc + +USE_I18N = True +LANGUAGE_CODE = 'en' +EMAIL_VALIDATION = 'off' #string - on|off +MIN_USERNAME_LENGTH = 1 +EMAIL_UNIQUE = False +APP_URL = 'http://osqa.net' #used by email notif system and RSS +GOOGLE_SITEMAP_CODE = '' +BOOKS_ON = False +WIKI_ON = True +USE_EXTERNAL_LEGACY_LOGIN = False +EXTERNAL_LEGACY_LOGIN_HOST = 'login.osqa.net' +EXTERNAL_LEGACY_LOGIN_PORT = 80 +EXTERNAL_LEGACY_LOGIN_PROVIDER_NAME = '<span class="orange">OSQA</span>' +FEEDBACK_SITE_URL = None #None or url +EDITABLE_SCREEN_NAME = False #True or False - can user change screen name? + +DJANGO_VERSION = 1.1 +RESOURCE_REVISION=4 + +USE_SPHINX_SEARCH = False #if True all SPHINX_* settings are required +#also sphinx search engine and djangosphinxs app must be installed +#sample sphinx configuration file is /sphinx/sphinx.conf +SPHINX_API_VERSION = 0x113 #refer to djangosphinx documentation +SPHINX_SEARCH_INDICES=('osqa',) #a tuple of index names remember about a comma after the +#last item, especially if you have just one :) +SPHINX_SERVER='localhost' +SPHINX_PORT=3312 + +#please get these at recaptcha.net +RECAPTCHA_PRIVATE_KEY='...' +RECAPTCHA_PUBLIC_KEY='...' + +#Facebook settings +USE_FB_CONNECT=True +FB_API_KEY='' #your api key from facebook +FB_SECRET='' #your application secret diff --git a/templates/unanswered.html b/templates/unanswered.html new file mode 100644 index 00000000..80a23631 --- /dev/null +++ b/templates/unanswered.html @@ -0,0 +1,132 @@ +{% extends "base.html" %} +<!-- unanswered.html --> +{% load extra_tags %} +{% load i18n %} +{% load humanize %} +{% load extra_filters %} +{% load smart_if %} +{% block title %}{% spaceless %}{% trans "Unanswered questions" %}{% endspaceless %}{% endblock %} +{% block forejs %} + <script type="text/javascript"> + $().ready(function(){ + $("#nav_unanswered").attr('className',"on"); + }); + + </script> +{% endblock %} +{% block content %} +<div class="tabBar"> + <span class="headQuestions">{% trans "Unanswered questions" %}</span> + <div class="tabsA"> + <a id="latest" href="{% url unanswered %}?sort=latest" class="on" title="{% trans "most recently asked questions" %}">{% trans "newest" %}</a> + </div> +</div> +<div id="listA"> + {% for question in questions.object_list %} + <div class="qstA"> + <h2> + <a href="{{ question.get_absolute_url }}">{{ question.get_question_title }}</a> + </h2> + <div class="stat"> + <table> + <tr> + <td><span class="num">{{ question.answer_count|intcomma }}</span> </td> + <td><span class="num">{{ question.score|intcomma }}</span> </td> + <td><span class="num">{{ question.view_count|cnprog_intword|safe }}</span> </td> + </tr> + <tr> + <td><span class="unit">{% trans "answers" %}</span></td> + <td><span class="unit">{% trans "votes" %}</span></td> + <td><span class="unit">{% trans "views" %}</span></td> + </tr> + </table> + </div> + + <div class="summary"> + {{ question.summary }}... + </div> + + {% ifequal tab_id 'active'%} + {% if question.wiki and settings.WIKI_ON %} + <span class="from wiki">{% trans "community wiki" %}</span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% else %} + <div class="from"> + {% comment %}{% gravatar question.last_activity_by 24 %}{% endcomment %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + </div> + {% endif %} + {% else %} + {% if question.wiki and settings.WIKI_ON %} + <span class="from wiki">{% trans "community wiki" %}</span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% else %} + <div class="from"> + {% comment %}{% gravatar question.author 24 %}{% endcomment %} + {% if question.last_activity_at != question.added_at %} + {% if question.author.id != question.last_activity_by.id %} + {% trans "Posted:" %} + <span class="author"><a href="{{ question.author.get_profile_url }}">{{ question.author }}</a></span> + <span class="score">{% get_score_badge question.author %} </span> + / {% trans "Updated:" %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + {% else %} + {% trans "Updated:" %} + <span class="author"><a href="{{ question.last_activity_by.get_profile_url }}">{{ question.last_activity_by }}</a></span> + <span class="score">{% get_score_badge question.last_activity_by %} </span> + <span class="date" title="{{ question.last_activity_at }}">{% diff_date question.last_activity_at %}</span> + {% endif %} + {% else %} + {% trans "Posted:" %} + <span class="author"><a href="{{ question.author.get_profile_url }}">{{ question.author }}</a></span> + <span class="score">{% get_score_badge question.author %} </span> + <span class="date" title="{{ question.added_at }}">{% diff_date question.added_at %}</span> + {% endif %} + </div> + {% endif %} + {% endifequal %} + + <div class="tags"> + {% for tag in question.tagname_list %} + <a href="{% url forum.views.tag tag|urlencode %}" title="{% trans "see questions tagged" %}'{{ tag }}'{% trans "using tags" %}" rel="tag">{{ tag }}</a> + {% endfor %} + </div> + </div> + {% endfor %} +</div> +{% endblock %} + +{% block tail %} + <div class="pager"> + {% cnprog_paginator context %} + </div> + <div class="pagesize"> + {% cnprog_pagesize context %} + </div> +{% endblock %} + +{% block sidebar %} +<div class="boxC"> + {% blocktrans with questions_count|intcomma as num_q %}have {{num_q}} unanswered questions{% endblocktrans %} + <!---<p>问题按 <strong>问题创建时间</strong> 排序。最新加入的问题将显示在最前面。</p>--> +</div> +<div class="boxC"> + <h3 class="subtitle">{% trans "Related tags" %}</h3> + <div class="body"> + <div class="tags"> + {% for tag in tags %} + <a rel="tag" title="{% trans "see questions tagged"%}'{{ tag.name }}'{% trans "using tags" %}" href="{% url forum.views.tag tag.name|urlencode %}">{{ tag.name }}</a> + <span class="tag-number"> × {{ tag.used_count|intcomma }}</span> + <br/> + {% endfor %} + <br/> + </div> + </div> +</div> + +{% endblock %} +<!-- end unanswered.html --> |