diff --git a/ckanext/issues/controller/controller.py b/ckanext/issues/controller/controller.py index 5beae8f1..57e138a4 100644 --- a/ckanext/issues/controller/controller.py +++ b/ckanext/issues/controller/controller.py @@ -103,7 +103,7 @@ def new(self, dataset_id, resource_id=None): }) if not data_dict['title']: - c.error_summary['title'] = ["Please enter a title"] + c.error_summary[_('title')] = [_("Please enter a title")] c.errors = c.error_summary if not c.error_summary: # save and redirect @@ -128,10 +128,10 @@ def show(self, issue_number, dataset_id): session=model.Session) except toolkit.ValidationError, e: p.toolkit.abort( - 404, toolkit._('Issue not found: {0}'.format(e.error_summary))) + 404, toolkit._(u'Issue not found: {0}').format(e.error_summary)) except toolkit.ObjectNotFound, e: p.toolkit.abort( - 404, toolkit._('Issue not found: {0}'.format(e))) + 404, toolkit._(u'Issue not found: {0}').format(e)) extra_vars['dataset'] = dataset return p.toolkit.render('issues/show.html', extra_vars=extra_vars) @@ -210,7 +210,10 @@ def comments(self, dataset_id, issue_number): 'dataset_id': dataset['id'], 'status': status } - logic.get_action('issue_update')(self.context, issue_dict) + try: + logic.get_action('issue_update')(self.context, issue_dict) + except p.toolkit.NotAuthorized as e: + p.toolkit.abort(401, e.message) if 'close' in request.POST: h.flash_success(_("Issue closed")) else: @@ -252,13 +255,11 @@ def delete(self, dataset_id, issue_number): 'dataset_id': dataset_id} ) except toolkit.NotAuthorized: - msg = _('Unauthorized to delete issue {0}'.format( - issue_number)) + msg = _(u'Unauthorized to delete issue {0}').format( + issue_number) toolkit.abort(401, msg) - h.flash_notice( - _('Issue {0} has been deleted.'.format(issue_number)) - ) + h.flash_notice(_(u'Issue has been deleted.')) p.toolkit.redirect_to('issues_dataset', dataset_id=dataset_id) else: return render('issues/confirm_delete.html', @@ -275,7 +276,7 @@ def assign(self, dataset_id, issue_number): assignee = toolkit.get_action('user_show')( data_dict={'id': assignee_id}) except toolkit.ObjectNotFound: - h.flash_error(_('User {0} does not exist'.format(assignee_id))) + h.flash_error(_(u'User {0} does not exist').format(assignee_id)) return p.toolkit.redirect_to('issues_show', issue_number=issue_number, dataset_id=dataset_id) @@ -295,8 +296,8 @@ def assign(self, dataset_id, issue_number): if notifications: subject = get_issue_subject(issue) - body = toolkit._('Assigned to {user}'.format( - user=assignee['display_name'])) + msg = toolkit._("Assigned to %s") + body = msg % assignee['display_name'] user_obj = model.User.get(assignee_id) try: @@ -305,8 +306,7 @@ def assign(self, dataset_id, issue_number): log.debug(e.message) except toolkit.NotAuthorized: - msg = _('Unauthorized to assign users to issue'.format( - issue_number)) + msg = _(u'Unauthorized to assign users to issue') toolkit.abort(401, msg) except toolkit.ValidationError, e: toolkit.abort(404) @@ -404,9 +404,7 @@ def report_clear(self, dataset_id, issue_number): dataset_id=dataset_id, issue_number=issue_number) except toolkit.NotAuthorized: - msg = _('You must be logged in clear abuse reports').format( - issue_number - ) + msg = _(u'You must be logged in clear abuse reports') toolkit.abort(401, msg) except toolkit.ValidationError: toolkit.abort(404) @@ -427,9 +425,7 @@ def comment_report_clear(self, dataset_id, issue_number, comment_id): dataset_id=dataset_id, issue_number=issue_number) except toolkit.NotAuthorized: - msg = _('You must be logged in to clear abuse reports').format( - issue_number - ) + msg = _(u'You must be logged in to clear abuse reports') toolkit.abort(401, msg) except toolkit.ValidationError: toolkit.abort(404) @@ -444,8 +440,8 @@ def issues_for_organization(self, org_id): try: template_params = issues_for_org(org_id, request.GET) except toolkit.ValidationError, e: - msg = toolkit._("Validation error: {0}".format(e.error_summary)) - log.warning(msg + ' - Issues for org: %s', org_id) + msg = toolkit._(u'Validation error: {0}').format(e.error_summary) + log.warning(msg + u' - Issues for org: %s', org_id) h.flash(msg, category='alert-error') return p.toolkit.redirect_to('issues_for_organization', org_id=org_id) @@ -484,7 +480,7 @@ def all_issues_page(self): def _dataset_handle_error(dataset_id, exc): - msg = toolkit._("Validation error: {0}".format(exc.error_summary)) + msg = toolkit._(u'Validation error: {0}').format(exc.error_summary) h.flash(msg, category='alert-error') return p.toolkit.redirect_to('issues_dataset', dataset_id=dataset_id) diff --git a/ckanext/issues/i18n/ckanext-issues.pot b/ckanext/issues/i18n/ckanext-issues.pot new file mode 100644 index 00000000..30d53d8b --- /dev/null +++ b/ckanext/issues/i18n/ckanext-issues.pot @@ -0,0 +1,626 @@ +# Translations template for ckanext-issues. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the ckanext-issues project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: ckanext-issues 0.3\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-07-09 15:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ckanext/issues/auth.py:20 +msgid "User {0} not authorized for action on issue {1}" +msgstr "" + +#: ckanext/issues/auth.py:42 +msgid "User {0} not authorized for action" +msgstr "" + +#: ckanext/issues/auth.py:91 +msgid "User {user} not authorized for action on issue {issue}" +msgstr "" + +#: ckanext/issues/controller/controller.py:48 +msgid "Issues have not been enabled for this dataset" +msgstr "" + +#: ckanext/issues/controller/controller.py:51 +#: ckanext/issues/controller/controller.py:69 +msgid "Dataset not found" +msgstr "" + +#: ckanext/issues/controller/controller.py:54 +msgid "Unauthorized to view issues for this dataset" +msgstr "" + +#: ckanext/issues/controller/controller.py:66 +msgid "Issues have not been enabled for this organization" +msgstr "" + +#: ckanext/issues/controller/controller.py:72 +msgid "Unauthorized to view issues for this organization" +msgstr "" + +#: ckanext/issues/controller/controller.py:77 +msgid "Please login to add a new issue" +msgstr "" + +#: ckanext/issues/controller/controller.py:86 +msgid "Not authorized to add a new issue" +msgstr "" + +#: ckanext/issues/controller/controller.py:106 +msgid "title" +msgstr "" + +#: ckanext/issues/controller/controller.py:106 +msgid "Please enter a title" +msgstr "" + +#: ckanext/issues/controller/controller.py:113 +msgid "Your issue has been registered, thank you for the feedback" +msgstr "" + +#: ckanext/issues/controller/controller.py:131 +#: ckanext/issues/controller/controller.py:134 +msgid "Issue not found: {0}" +msgstr "" + +#: ckanext/issues/controller/controller.py:178 +msgid "Invalid request" +msgstr "" + +#: ckanext/issues/controller/controller.py:190 +msgid "Not authorized" +msgstr "" + +#: ckanext/issues/controller/controller.py:199 +msgid "Comment cannot be empty" +msgstr "" + +#: ckanext/issues/controller/controller.py:218 +msgid "Issue closed" +msgstr "" + +#: ckanext/issues/controller/controller.py:220 +msgid "Issue re-opened" +msgstr "" + +#: ckanext/issues/controller/controller.py:258 +msgid "Unauthorized to delete issue {0}" +msgstr "" + +#: ckanext/issues/controller/controller.py:262 +msgid "Issue has been deleted." +msgstr "" + +#: ckanext/issues/controller/controller.py:279 +msgid "User {0} does not exist" +msgstr "" + +#: ckanext/issues/controller/controller.py:299 +#, python-format +msgid "Assigned to %s" +msgstr "" + +#: ckanext/issues/controller/controller.py:309 +msgid "Unauthorized to assign users to issue" +msgstr "" + +#: ckanext/issues/controller/controller.py:322 +msgid "You must be logged in to report issues" +msgstr "" + +#: ckanext/issues/controller/controller.py:333 +#: ckanext/issues/controller/controller.py:370 +msgid "Report acknowledged." +msgstr "" + +#: ckanext/issues/controller/controller.py:336 +#: ckanext/issues/controller/controller.py:373 +msgid "Marked as abuse/spam." +msgstr "" + +#: ckanext/issues/controller/controller.py:337 +msgid "Issue is visible." +msgstr "" + +#: ckanext/issues/controller/controller.py:339 +msgid "Issue is invisible to normal users." +msgstr "" + +#: ckanext/issues/controller/controller.py:342 +msgid "Issue reported to an administrator" +msgstr "" + +#: ckanext/issues/controller/controller.py:358 +msgid "You must be logged in to report comments" +msgstr "" + +#: ckanext/issues/controller/controller.py:374 +msgid "Comment is visible." +msgstr "" + +#: ckanext/issues/controller/controller.py:376 +msgid "Comment is invisible to normal users." +msgstr "" + +#: ckanext/issues/controller/controller.py:379 +msgid "Comment has been reported to an administrator" +msgstr "" + +#: ckanext/issues/controller/controller.py:402 +msgid "Issue report cleared" +msgstr "" + +#: ckanext/issues/controller/controller.py:407 +msgid "You must be logged in clear abuse reports" +msgstr "" + +#: ckanext/issues/controller/controller.py:423 +msgid "Spam/abuse report cleared" +msgstr "" + +#: ckanext/issues/controller/controller.py:428 +msgid "You must be logged in to clear abuse reports" +msgstr "" + +#: ckanext/issues/controller/controller.py:443 +#: ckanext/issues/controller/controller.py:483 +msgid "Validation error: {0}" +msgstr "" + +#: ckanext/issues/controller/moderation.py:17 +#: ckanext/issues/controller/moderation.py:76 +msgid "Organization not found" +msgstr "" + +#: ckanext/issues/controller/moderation.py:22 +msgid "You must be logged in to moderate issues" +msgstr "" + +#: ckanext/issues/controller/moderation.py:29 +msgid "Issue permanently hidden" +msgstr "" + +#: ckanext/issues/controller/moderation.py:33 +msgid "All issue reports cleared" +msgstr "" + +#: ckanext/issues/controller/moderation.py:81 +msgid "You must be logged in to moderate comment" +msgstr "" + +#: ckanext/issues/controller/moderation.py:88 +msgid "Comment permanently hidden" +msgstr "" + +#: ckanext/issues/controller/moderation.py:92 +msgid "All comment reports cleared" +msgstr "" + +#: ckanext/issues/controller/show.py:18 +msgid "No description provided" +msgstr "" + +#: ckanext/issues/lib/helpers.py:202 +#, python-format +msgid "[%s Issue] %s" +msgstr "" + +#: ckanext/issues/logic/action/action.py:63 +msgid "Issue does not exist" +msgstr "" + +#: ckanext/issues/logic/action/action.py:83 +msgid "Issue marked as spam/abuse" +msgstr "" + +#: ckanext/issues/logic/action/action.py:566 +msgid "Issue has already been reported by this user" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:13 +msgid "{0} is not a valid status" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:44 +#: ckanext/issues/logic/validators/validators.py:55 +msgid "Not found" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:45 +msgid "Dataset" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:56 +msgid "Organization" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:65 +#: ckanext/issues/logic/validators/validators.py:78 +msgid "Issue not found" +msgstr "" + +#: ckanext/issues/logic/validators/validators.py:87 +msgid "Issue Comment not found" +msgstr "" + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:31 +msgid "No matches found" +msgstr "" + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:32 +msgid "Start typing…" +msgstr "" + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:34 +msgid "Input is too short, must be at least one character" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:3 +#: ckanext/issues/templates/issues/add.html:5 +#: ckanext/issues/templates/issues/dataset.html:22 +msgid "New Issue" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:16 +#: ckanext/issues/templates/issues/edit.html:14 +msgid "The form contains invalid entries:" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:27 +#: ckanext/issues/templates/issues/edit.html:25 +msgid "Title" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:28 +#: ckanext/issues/templates/issues/edit.html:26 +msgid "Description" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:28 +#: ckanext/issues/templates/issues/edit.html:26 +msgid "Add a comment" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:33 +#: ckanext/issues/templates/issues/confirm_delete.html:14 +#: ckanext/issues/templates/issues/edit.html:34 +msgid "Cancel" +msgstr "" + +#: ckanext/issues/templates/issues/add.html:35 +msgid "Create" +msgstr "" + +#: ckanext/issues/templates/issues/all_issues.html:5 +#: ckanext/issues/templates/issues/all_issues.html:12 +msgid "All Issues" +msgstr "" + +#: ckanext/issues/templates/issues/all_issues.html:24 +msgid "There are currently no issues" +msgstr "" + +#: ckanext/issues/templates/issues/base.html:9 +msgid "Datasets" +msgstr "" + +#: ckanext/issues/templates/issues/base_form_page.html:14 +msgid "What are issues?" +msgstr "" + +#: ckanext/issues/templates/issues/base_form_page.html:16 +msgid "Issues are the system for getting feedback about datasets." +msgstr "" + +#: ckanext/issues/templates/issues/comment_moderation.html:8 +#: ckanext/issues/templates/issues/moderation.html:8 +msgid "Reported issues" +msgstr "" + +#: ckanext/issues/templates/issues/comment_moderation.html:28 +#: ckanext/issues/templates/issues/moderation.html:28 +#: ckanext/issues/templates/issues/organization_issues.html:11 +msgid "Organizations" +msgstr "" + +#: ckanext/issues/templates/issues/comment_moderation.html:68 +#: ckanext/issues/templates/issues/moderation.html:69 +msgid "Not abuse" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:12 +msgid "Opened by" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:14 +msgid "updated" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:18 +#: ckanext/issues/templates/issues/organization_issues.html:76 +#, python-format +msgid "%s comments" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:25 +msgid "Spam/Abuse - hidden from normal users" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:29 +msgid "Reported by you to admins" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:38 +msgid "Status" +msgstr "" + +#: ckanext/issues/templates/issues/common.html:52 +msgid "Visibility" +msgstr "" + +#: ckanext/issues/templates/issues/confirm_delete.html:3 +#: ckanext/issues/templates/issues/confirm_delete.html:15 +msgid "Confirm Delete" +msgstr "" + +#: ckanext/issues/templates/issues/confirm_delete.html:11 +msgid "Are you sure you want to delete issue - {0}?" +msgstr "" + +#: ckanext/issues/templates/issues/dataset.html:14 +#: ckanext/issues/templates/issues/dataset.html:20 +#: ckanext/issues/templates/issues/organization_issues.html:8 +#: ckanext/issues/templates/issues/organization_issues.html:22 +#: ckanext/issues/templates/issues/show.html:13 +msgid "Issues" +msgstr "" + +#: ckanext/issues/templates/issues/dataset.html:26 +#: ckanext/issues/templates/issues/organization_issues.html:27 +msgid "Search issues..." +msgstr "" + +#: ckanext/issues/templates/issues/dataset.html:35 +msgid "No issues" +msgstr "" + +#: ckanext/issues/templates/issues/edit.html:3 +#: ckanext/issues/templates/issues/edit.html:5 +msgid "Edit Issue" +msgstr "" + +#: ckanext/issues/templates/issues/edit.html:36 +msgid "Update" +msgstr "" + +#: ckanext/issues/templates/issues/organization_issues.html:29 +#: ckanext/issues/templates/snippets/search_result_text.html:5 +msgid "{number} issue found" +msgid_plural "{number} issues found" +msgstr[0] "" +msgstr[1] "" + +#: ckanext/issues/templates/issues/show.html:76 +msgid "Owner" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:81 +msgid "commented" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:100 +msgid "Report abuse" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:111 +msgid "You have reported this as abuse, cancel the report" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:112 +#: ckanext/issues/templates/issues/show.html:128 +msgid "Flag" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:127 +msgid "Mark as spam/abuse" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:140 +msgid "Mark as NOT spam/abuse" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:141 +msgid "Not spam/abuse" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:149 +msgid "user reports this is spam/abuse" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:154 +msgid "Hidden from normal users" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:159 +msgid "Moderated" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:178 +msgid "opened this issue" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:179 +msgid "{number} comment" +msgid_plural "{number} comments" +msgstr[0] "" +msgstr[1] "" + +#: ckanext/issues/templates/issues/show.html:204 +msgid "Leave a comment" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:207 +msgid "You can use Markdown formatting here" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:213 +msgid "Are you sure you want to delete this issue?" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:214 +msgid "Please Confirm Action" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:214 +msgid "Delete" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:220 +msgid "Close" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:224 +msgid "Re-open" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:230 +msgid "Comment" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:237 +msgid "Login to comment" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:248 +msgid "All issues of dataset" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:248 +msgid "All issues of this dataset" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:256 +msgid "Assignee" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:263 +msgid "This issue has been assigned to an administrator for the publisher" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:265 +msgid "No one" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:271 +msgid "Change Assignee" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:276 +msgid "Username" +msgstr "" + +#: ckanext/issues/templates/issues/show.html:281 +msgid "Assign" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:2 +msgid "A user " +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:2 +msgid "has added a comment to one of your issues on " +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:4 +msgid "The dataset is" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:5 +msgid "The issue is" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:6 +msgid "The comment is" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:9 +msgid "In order to respond to the comment, please see the issue at" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:10 +#: ckanext/issues/templates/issues/email/new_issue.html:11 +msgid "Once the issue has been resolved, click 'Close issue'." +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:12 +msgid "Thank you" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:14 +#: ckanext/issues/templates/issues/email/new_issue.html:15 +msgid "The" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:14 +#: ckanext/issues/templates/issues/email/new_issue.html:15 +msgid "team" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:17 +#: ckanext/issues/templates/issues/email/new_issue.html:19 +msgid "Message sent by" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid "On open data portal" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid " a user has raised an issue with one of the datasets from organization" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid "for which you are an" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:4 +msgid "The dataset is: " +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:6 +msgid "The issue is:" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:11 +msgid "Please correct the problem or add an initial comment about the issue at: " +msgstr "" + +#: ckanext/issues/templates/issues/email/new_issue.html:13 +msgid "Thank you," +msgstr "" + +#: ckanext/issues/templates/snippets/search_result_text.html:3 +msgid "{number} issue found for \"{query}\"" +msgid_plural "{number} issues found for \"{query}\"" +msgstr[0] "" +msgstr[1] "" + +#: ckanext/issues/templates/snippets/search_result_text.html:4 +msgid "No issues found for \"{query}\"" +msgstr "" + +#: ckanext/issues/templates/snippets/search_result_text.html:6 +msgid "No issues found" +msgstr "" + diff --git a/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.mo b/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.mo new file mode 100644 index 00000000..f98765af Binary files /dev/null and b/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.mo differ diff --git a/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.po b/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.po new file mode 100644 index 00000000..d4d072aa --- /dev/null +++ b/ckanext/issues/i18n/uk_UA/LC_MESSAGES/ckanext-issues.po @@ -0,0 +1,668 @@ +# Ukrainian (Ukraine) translations for ckanext-issues. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the ckanext-issues +# project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: ckanext-issues 0.3\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-07-09 15:10+0000\n" +"PO-Revision-Date: 2018-03-20 22:22+0000\n" +"Last-Translator: FULL NAME \n" +"Language: uk_UA\n" +"Language-Team: uk_UA \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ckanext/issues/auth.py:20 +msgid "User {0} not authorized for action on issue {1}" +msgstr "Користувач {0} не має достатньо прав для роботи зі пропозиціями {1}" + +#: ckanext/issues/auth.py:42 +msgid "User {0} not authorized for action" +msgstr "Користувач {0} не має достатньо прав для цієї дії" + +#: ckanext/issues/auth.py:91 +msgid "User {user} not authorized for action on issue {issue}" +msgstr "Користувач {user} не має достатньо прав для роботи зі пропозиціями {issue}" + +#: ckanext/issues/controller/controller.py:48 +msgid "Issues have not been enabled for this dataset" +msgstr "Пропозиції недоступні для цього набору даних" + +#: ckanext/issues/controller/controller.py:51 +#: ckanext/issues/controller/controller.py:69 +msgid "Dataset not found" +msgstr "Набір даних не знайдено" + +#: ckanext/issues/controller/controller.py:54 +msgid "Unauthorized to view issues for this dataset" +msgstr "У вас немає доступу для перегляду пропозицій по цьому набору даних" + +#: ckanext/issues/controller/controller.py:66 +msgid "Issues have not been enabled for this organization" +msgstr "Пропозиції недоступні для цього розпорядника" + +#: ckanext/issues/controller/controller.py:72 +msgid "Unauthorized to view issues for this organization" +msgstr "У вас немає доступу для перегляду пропозицій на цього розпорядника" + +#: ckanext/issues/controller/controller.py:77 +msgid "Please login to add a new issue" +msgstr "Будь ласка, увійдіть, щоб додати нову пропозицію" + +#: ckanext/issues/controller/controller.py:86 +msgid "Not authorized to add a new issue" +msgstr "У вас немає доступу для додавання нової пропозиції" + +#: ckanext/issues/controller/controller.py:106 +msgid "title" +msgstr "Назва" + +#: ckanext/issues/controller/controller.py:106 +msgid "Please enter a title" +msgstr "Будь ласка, введіть назву" + +#: ckanext/issues/controller/controller.py:113 +msgid "Your issue has been registered, thank you for the feedback" +msgstr "Ваша пропозиція була зареєстрована. Дякуємо за зворотній зв'язок" + +#: ckanext/issues/controller/controller.py:131 +#: ckanext/issues/controller/controller.py:134 +msgid "Issue not found: {0}" +msgstr "Пропозицію не знайдено: {0}" + +#: ckanext/issues/controller/controller.py:178 +msgid "Invalid request" +msgstr "Неправильний запит" + +#: ckanext/issues/controller/controller.py:190 +msgid "Not authorized" +msgstr "Немає доступу" + +#: ckanext/issues/controller/controller.py:199 +msgid "Comment cannot be empty" +msgstr "Поле \"Комментар\" не може бути порожнім" + +#: ckanext/issues/controller/controller.py:218 +msgid "Issue closed" +msgstr "Пропозицію закрито" + +#: ckanext/issues/controller/controller.py:220 +msgid "Issue re-opened" +msgstr "Пропозицію знову відкрито" + +#: ckanext/issues/controller/controller.py:258 +msgid "Unauthorized to delete issue {0}" +msgstr "У вас недостатньо прав доступу, щоб видалити пропозицію {0}" + +#: ckanext/issues/controller/controller.py:262 +msgid "Issue has been deleted." +msgstr "Пропозицію було знищено." + +#: ckanext/issues/controller/controller.py:279 +msgid "User {0} does not exist" +msgstr "Користувача {0} не існує" + +#: ckanext/issues/controller/controller.py:299 +#, python-format +msgid "Assigned to %s" +msgstr "Закріплена за %s" + +#: ckanext/issues/controller/controller.py:309 +msgid "Unauthorized to assign users to issue" +msgstr "У вас немає прав доступу для закріплення користувачів за пропозицією" + +#: ckanext/issues/controller/controller.py:322 +msgid "You must be logged in to report issues" +msgstr "Ви повинні увійти, щоб подавати пропозиції" + +#: ckanext/issues/controller/controller.py:333 +#: ckanext/issues/controller/controller.py:370 +msgid "Report acknowledged." +msgstr "Звіт підтверджено." + +#: ckanext/issues/controller/controller.py:336 +#: ckanext/issues/controller/controller.py:373 +msgid "Marked as abuse/spam." +msgstr "Позначено як зловживання/спам." + +#: ckanext/issues/controller/controller.py:337 +msgid "Issue is visible." +msgstr "Пропозиція - видима." + +#: ckanext/issues/controller/controller.py:339 +msgid "Issue is invisible to normal users." +msgstr "Пропозиція - невидима для звичайних користувачів." + +#: ckanext/issues/controller/controller.py:342 +msgid "Issue reported to an administrator" +msgstr "Пропозицію надіслано адміністратору" + +#: ckanext/issues/controller/controller.py:358 +msgid "You must be logged in to report comments" +msgstr "Ви повинні зайти в систему, щоб поскаржитися на коментарі" + +#: ckanext/issues/controller/controller.py:374 +msgid "Comment is visible." +msgstr "Коментар - видимий." + +#: ckanext/issues/controller/controller.py:376 +msgid "Comment is invisible to normal users." +msgstr "Коментар - невидимий для простих користувачів." + +#: ckanext/issues/controller/controller.py:379 +msgid "Comment has been reported to an administrator" +msgstr "Коментар надіслано адміністратору" + +#: ckanext/issues/controller/controller.py:402 +msgid "Issue report cleared" +msgstr "Пропозицію розглянуто" + +#: ckanext/issues/controller/controller.py:407 +msgid "You must be logged in clear abuse reports" +msgstr "Ви повинні увійти в систему, щоб розглянути пропозицію" + +#: ckanext/issues/controller/controller.py:423 +msgid "Spam/abuse report cleared" +msgstr "Спам/пропозицію розглянуто" + +#: ckanext/issues/controller/controller.py:428 +msgid "You must be logged in to clear abuse reports" +msgstr "Ви повинні увійти в систему, щоб розглянути пропозицію" + +#: ckanext/issues/controller/controller.py:443 +#: ckanext/issues/controller/controller.py:483 +msgid "Validation error: {0}" +msgstr "Помилка перевірки: {0}" + +#: ckanext/issues/controller/moderation.py:17 +#: ckanext/issues/controller/moderation.py:76 +msgid "Organization not found" +msgstr "Розпорядника не знайдено" + +#: ckanext/issues/controller/moderation.py:22 +msgid "You must be logged in to moderate issues" +msgstr "Ви повинні увійти в систему, щоб опрацювати пропозиції" + +#: ckanext/issues/controller/moderation.py:29 +msgid "Issue permanently hidden" +msgstr "Пропозицію приховано назавжди" + +#: ckanext/issues/controller/moderation.py:33 +msgid "All issue reports cleared" +msgstr "Усі пропозиції розглянуті" + +#: ckanext/issues/controller/moderation.py:81 +msgid "You must be logged in to moderate comment" +msgstr "Ви повинні увійти в систему, щоб розглянути коментар" + +#: ckanext/issues/controller/moderation.py:88 +msgid "Comment permanently hidden" +msgstr "Коментар приховано назавжди" + +#: ckanext/issues/controller/moderation.py:92 +msgid "All comment reports cleared" +msgstr "Всі коментарі до пропозиції розглянуто" + +#: ckanext/issues/controller/show.py:18 +msgid "No description provided" +msgstr "Опису немає" + +#: ckanext/issues/lib/helpers.py:202 +#, python-format +msgid "[%s Issue] %s" +msgstr "[%s Пропозиція] %s" + +#: ckanext/issues/logic/action/action.py:63 +msgid "Issue does not exist" +msgstr "Такої пропозиції не існує" + +#: ckanext/issues/logic/action/action.py:83 +msgid "Issue marked as spam/abuse" +msgstr "Пропозицію помічено, як спам/зловживання" + +#: ckanext/issues/logic/action/action.py:566 +msgid "Issue has already been reported by this user" +msgstr "Пропозиція вже була подана цим користувачем" + +#: ckanext/issues/logic/validators/validators.py:13 +msgid "{0} is not a valid status" +msgstr "{0} неправильний статус" + +#: ckanext/issues/logic/validators/validators.py:44 +#: ckanext/issues/logic/validators/validators.py:55 +msgid "Not found" +msgstr "Не знайдено" + +#: ckanext/issues/logic/validators/validators.py:45 +msgid "Dataset" +msgstr "Набір даних" + +#: ckanext/issues/logic/validators/validators.py:56 +msgid "Organization" +msgstr "Розпорядник" + +#: ckanext/issues/logic/validators/validators.py:65 +#: ckanext/issues/logic/validators/validators.py:78 +msgid "Issue not found" +msgstr "Пропозицію не знайдено" + +#: ckanext/issues/logic/validators/validators.py:87 +msgid "Issue Comment not found" +msgstr "Коментар до пропозиції не знайдено" + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:31 +msgid "No matches found" +msgstr "Збігів не знайдено" + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:32 +msgid "Start typing…" +msgstr "Почніть друкувати..." + +#: ckanext/issues/public/scripts/autocomplete-action-api.js:34 +msgid "Input is too short, must be at least one character" +msgstr "Вхідні дані - занадто короткі. Слід ввести щонайменше один символ" + +#: ckanext/issues/templates/issues/add.html:3 +#: ckanext/issues/templates/issues/add.html:5 +#: ckanext/issues/templates/issues/dataset.html:22 +msgid "New Issue" +msgstr "Нова пропозиція" + +#: ckanext/issues/templates/issues/add.html:16 +#: ckanext/issues/templates/issues/edit.html:14 +msgid "The form contains invalid entries:" +msgstr "Форма містить неправильні записи:" + +#: ckanext/issues/templates/issues/add.html:27 +#: ckanext/issues/templates/issues/edit.html:25 +msgid "Title" +msgstr "Назва" + +#: ckanext/issues/templates/issues/add.html:28 +#: ckanext/issues/templates/issues/edit.html:26 +msgid "Description" +msgstr "Опис" + +#: ckanext/issues/templates/issues/add.html:28 +#: ckanext/issues/templates/issues/edit.html:26 +msgid "Add a comment" +msgstr "Додати коментар" + +#: ckanext/issues/templates/issues/add.html:33 +#: ckanext/issues/templates/issues/confirm_delete.html:14 +#: ckanext/issues/templates/issues/edit.html:34 +msgid "Cancel" +msgstr "Скасувати" + +#: ckanext/issues/templates/issues/add.html:35 +msgid "Create" +msgstr "Створити" + +#: ckanext/issues/templates/issues/all_issues.html:5 +#: ckanext/issues/templates/issues/all_issues.html:12 +msgid "All Issues" +msgstr "Всі пропозиції" + +#: ckanext/issues/templates/issues/all_issues.html:24 +msgid "There are currently no issues" +msgstr "Наразі немає жодних пропозицій" + +#: ckanext/issues/templates/issues/base.html:9 +msgid "Datasets" +msgstr "Набори даних" + +#: ckanext/issues/templates/issues/base_form_page.html:14 +msgid "What are issues?" +msgstr "Що таке пропозиції?" + +#: ckanext/issues/templates/issues/base_form_page.html:16 +msgid "Issues are the system for getting feedback about datasets." +msgstr "Пропозиції — це зворотній звя'зок між розпорядниками та користувачами." + +#: ckanext/issues/templates/issues/comment_moderation.html:8 +#: ckanext/issues/templates/issues/moderation.html:8 +msgid "Reported issues" +msgstr "Подані пропозиції" + +#: ckanext/issues/templates/issues/comment_moderation.html:28 +#: ckanext/issues/templates/issues/moderation.html:28 +#: ckanext/issues/templates/issues/organization_issues.html:11 +msgid "Organizations" +msgstr "Розпорядники" + +#: ckanext/issues/templates/issues/comment_moderation.html:68 +#: ckanext/issues/templates/issues/moderation.html:69 +msgid "Not abuse" +msgstr "Це не образа" + +#: ckanext/issues/templates/issues/common.html:12 +msgid "Opened by" +msgstr "Створив" + +#: ckanext/issues/templates/issues/common.html:14 +msgid "updated" +msgstr "оновлено" + +#: ckanext/issues/templates/issues/common.html:18 +#: ckanext/issues/templates/issues/organization_issues.html:76 +#, python-format +msgid "%s comments" +msgstr "%s коментарі" + +#: ckanext/issues/templates/issues/common.html:25 +msgid "Spam/Abuse - hidden from normal users" +msgstr "Спам/Зловживання - приховано від звичайних користувачів" + +#: ckanext/issues/templates/issues/common.html:29 +msgid "Reported by you to admins" +msgstr "Ваше повідомлення надіслане адміністратору." + +#: ckanext/issues/templates/issues/common.html:38 +msgid "Status" +msgstr "Статус" + +#: ckanext/issues/templates/issues/common.html:52 +msgid "Visibility" +msgstr "Відкритість" + +#: ckanext/issues/templates/issues/confirm_delete.html:3 +#: ckanext/issues/templates/issues/confirm_delete.html:15 +msgid "Confirm Delete" +msgstr "Підтвердити видалення" + +#: ckanext/issues/templates/issues/confirm_delete.html:11 +msgid "Are you sure you want to delete issue - {0}?" +msgstr "Ви впевнені, що хочете видалити пропозицію - {0}?" + +#: ckanext/issues/templates/issues/dataset.html:14 +#: ckanext/issues/templates/issues/dataset.html:20 +#: ckanext/issues/templates/issues/organization_issues.html:8 +#: ckanext/issues/templates/issues/organization_issues.html:22 +#: ckanext/issues/templates/issues/show.html:13 +msgid "Issues" +msgstr "Пропозиції" + +#: ckanext/issues/templates/issues/dataset.html:26 +#: ckanext/issues/templates/issues/organization_issues.html:27 +msgid "Search issues..." +msgstr "Шукати пропозиції..." + +#: ckanext/issues/templates/issues/dataset.html:35 +msgid "No issues" +msgstr "Пропозицій немає" + +#: ckanext/issues/templates/issues/edit.html:3 +#: ckanext/issues/templates/issues/edit.html:5 +msgid "Edit Issue" +msgstr "Редагувати пропозицію" + +#: ckanext/issues/templates/issues/edit.html:36 +msgid "Update" +msgstr "Оновити" + +#: ckanext/issues/templates/issues/organization_issues.html:29 +#: ckanext/issues/templates/snippets/search_result_text.html:5 +msgid "{number} issue found" +msgid_plural "{number} issues found" +msgstr[0] "{number} пропозицію знайдена" +msgstr[1] "{number} пропозиції знайдено" +msgstr[2] "{number} пропозицій знайдено" + +#: ckanext/issues/templates/issues/show.html:76 +msgid "Owner" +msgstr "Власник" + +#: ckanext/issues/templates/issues/show.html:81 +msgid "commented" +msgstr "прокоментовано" + +#: ckanext/issues/templates/issues/show.html:100 +msgid "Report abuse" +msgstr "Повідомити про зловживання" + +#: ckanext/issues/templates/issues/show.html:111 +msgid "You have reported this as abuse, cancel the report" +msgstr "Ваше повідомлення про зловживання зафіксовано. Бажаєте скасувати запит?" + +#: ckanext/issues/templates/issues/show.html:112 +#: ckanext/issues/templates/issues/show.html:128 +msgid "Flag" +msgstr "Cигналізувати" + +#: ckanext/issues/templates/issues/show.html:127 +msgid "Mark as spam/abuse" +msgstr "Помітити це як спам/зловживання" + +#: ckanext/issues/templates/issues/show.html:140 +msgid "Mark as NOT spam/abuse" +msgstr "Помітити це як НЕ спам/зловживання" + +#: ckanext/issues/templates/issues/show.html:141 +msgid "Not spam/abuse" +msgstr "Не є спамом чи зловживанням" + +#: ckanext/issues/templates/issues/show.html:149 +msgid "user reports this is spam/abuse" +msgstr "користувач помітив це як спам/зловживання" + +#: ckanext/issues/templates/issues/show.html:154 +msgid "Hidden from normal users" +msgstr "Приховано від звичайних користувачів" + +#: ckanext/issues/templates/issues/show.html:159 +msgid "Moderated" +msgstr "Змодеровано" + +#: ckanext/issues/templates/issues/show.html:178 +msgid "opened this issue" +msgstr "створив пропозицію" + +#: ckanext/issues/templates/issues/show.html:179 +msgid "{number} comment" +msgid_plural "{number} comments" +msgstr[0] "{number} коментар" +msgstr[1] "{number} коментарі" +msgstr[2] "{number} коментарів" + +#: ckanext/issues/templates/issues/show.html:204 +msgid "Leave a comment" +msgstr "Залишити коментар" + +#: ckanext/issues/templates/issues/show.html:207 +msgid "You can use Markdown formatting here" +msgstr "Тут можете використовувати форматування." + +#: ckanext/issues/templates/issues/show.html:213 +msgid "Are you sure you want to delete this issue?" +msgstr "Ви впевнені, що хочете видалити цю пропозицію?" + +#: ckanext/issues/templates/issues/show.html:214 +msgid "Please Confirm Action" +msgstr "Будь ласка, підтвердіть дію" + +#: ckanext/issues/templates/issues/show.html:214 +msgid "Delete" +msgstr "Видалити" + +#: ckanext/issues/templates/issues/show.html:220 +msgid "Close" +msgstr "Закрити" + +#: ckanext/issues/templates/issues/show.html:224 +msgid "Re-open" +msgstr "Відкрити знову" + +#: ckanext/issues/templates/issues/show.html:230 +msgid "Comment" +msgstr "Коментар" + +#: ckanext/issues/templates/issues/show.html:237 +msgid "Login to comment" +msgstr "Увійдіть, щоб коментувати" + +#: ckanext/issues/templates/issues/show.html:248 +msgid "All issues of dataset" +msgstr "Всі пропозиції набору даних" + +#: ckanext/issues/templates/issues/show.html:248 +msgid "All issues of this dataset" +msgstr "Всі пропозиції" + +#: ckanext/issues/templates/issues/show.html:256 +msgid "Assignee" +msgstr "Призначено" + +#: ckanext/issues/templates/issues/show.html:263 +msgid "This issue has been assigned to an administrator for the publisher" +msgstr "Ця пропозиція була закріплена за адміністратором розпорядника" + +#: ckanext/issues/templates/issues/show.html:265 +msgid "No one" +msgstr "Нікого" + +#: ckanext/issues/templates/issues/show.html:271 +msgid "Change Assignee" +msgstr "Змінити уповноваженого" + +#: ckanext/issues/templates/issues/show.html:276 +msgid "Username" +msgstr "Ім'я користувача" + +#: ckanext/issues/templates/issues/show.html:281 +msgid "Assign" +msgstr "Закріпити" + +#: ckanext/issues/templates/issues/email/new_comment.html:2 +msgid "A user " +msgstr "Користувач" + +#: ckanext/issues/templates/issues/email/new_comment.html:2 +msgid "has added a comment to one of your issues on " +msgstr "додав коментар до вашої пропозиції " + +#: ckanext/issues/templates/issues/email/new_comment.html:4 +msgid "The dataset is" +msgstr "Набір даних" + +#: ckanext/issues/templates/issues/email/new_comment.html:5 +msgid "The issue is" +msgstr "Пропозиція" + +#: ckanext/issues/templates/issues/email/new_comment.html:6 +msgid "The comment is" +msgstr "Коментар" + +#: ckanext/issues/templates/issues/email/new_comment.html:9 +msgid "In order to respond to the comment, please see the issue at" +msgstr "Для відповіді на коментар, перейдить до пропозиції" + +#: ckanext/issues/templates/issues/email/new_comment.html:10 +#: ckanext/issues/templates/issues/email/new_issue.html:11 +msgid "Once the issue has been resolved, click 'Close issue'." +msgstr "Якщо пропозиція прийнята, то виберить 'Закрити'." + +#: ckanext/issues/templates/issues/email/new_comment.html:12 +msgid "Thank you" +msgstr "Дякуємо," + +#: ckanext/issues/templates/issues/email/new_comment.html:14 +#: ckanext/issues/templates/issues/email/new_issue.html:15 +msgid "The" +msgstr "" + +#: ckanext/issues/templates/issues/email/new_comment.html:14 +#: ckanext/issues/templates/issues/email/new_issue.html:15 +msgid "team" +msgstr "команда" + +#: ckanext/issues/templates/issues/email/new_comment.html:17 +#: ckanext/issues/templates/issues/email/new_issue.html:19 +msgid "Message sent by" +msgstr "Відправлено" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid "On open data portal" +msgstr "На порталі відкритих даних" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid " a user has raised an issue with one of the datasets from organization" +msgstr "" +"користувач почав обговорення пропозиції з одного з наборів даних " +"розпорядника" + +#: ckanext/issues/templates/issues/email/new_issue.html:2 +msgid "for which you are an" +msgstr "де ви є " + +#: ckanext/issues/templates/issues/email/new_issue.html:4 +msgid "The dataset is: " +msgstr "Набір даних: " + +#: ckanext/issues/templates/issues/email/new_issue.html:6 +msgid "The issue is:" +msgstr "Пропозиція: " + +#: ckanext/issues/templates/issues/email/new_issue.html:11 +msgid "Please correct the problem or add an initial comment about the issue at: " +msgstr "Будь ласка, вирішіть проблему чи додайте перший коментар до пропозиції: " + +#: ckanext/issues/templates/issues/email/new_issue.html:13 +msgid "Thank you," +msgstr "Дякуємо," + +#: ckanext/issues/templates/snippets/search_result_text.html:3 +msgid "{number} issue found for \"{query}\"" +msgid_plural "{number} issues found for \"{query}\"" +msgstr[0] "{number} пропозиція знайдена по \"{query}\\" +msgstr[1] "{number} пропозиції знайдено по \"{query}\\" +msgstr[2] "{number} пропозиції знайдено по \"{query}\\" + +#: ckanext/issues/templates/snippets/search_result_text.html:4 +msgid "No issues found for \"{query}\"" +msgstr "Пропозиції на \"{query}\" не знайдені" + +#: ckanext/issues/templates/snippets/search_result_text.html:6 +msgid "No issues found" +msgstr "Пропозиції не знайдені" + + +# Don't delete +#~ msgid "Open" +#~ msgstr "Відкрита" + +#~ msgid "Least Commented" +#~ msgstr "Востаннє внесеним коментарем" + +#~ msgid "Closed" +#~ msgstr "Закрита" + +#~ msgid "Visible" +#~ msgstr "Відкриті" + +#~ msgid "Hidden" +#~ msgstr "Скриті" + +# Don't delete need for sorting +#~ msgid "Newest" +#~ msgstr "Датою створення (за спаданням)" + +#~ msgid "Oldest" +#~ msgstr "Датою створення (за зростанням)" + +#~ msgid "Most Commented" +#~ msgstr "Кількістю коментарів (за спаданням)" + +#~ msgid "Most Recently Updated" +#~ msgstr "Кількістю оновлень (за спаданням)" + +#~ msgid "Least Recently Updated" +#~ msgstr "Датою оновлення (за спаданням)" + diff --git a/ckanext/issues/lib/helpers.py b/ckanext/issues/lib/helpers.py index 42fac95d..73fe9199 100644 --- a/ckanext/issues/lib/helpers.py +++ b/ckanext/issues/lib/helpers.py @@ -91,7 +91,7 @@ def iter_pages(self): def get_issue_filter_types(): - return [(f.value, k) for k, f in IssueFilter.__members__.items()] + return [(toolkit._(f.value), k) for k, f in IssueFilter.__members__.items()] def get_issues_per_page(): @@ -199,11 +199,8 @@ def get_site_title(): def get_issue_subject(issue): site_title = get_site_title() dataset = model.Package.get(issue['dataset_id']) - return toolkit._( - '[{site_title} Issue] {dataset}').format( - site_title=site_title, - dataset=dataset.title, - ) + msg = toolkit._('[%s Issue] %s') + return msg % (site_title, dataset.title) def issues_user_is_owner(user, dataset_id): diff --git a/ckanext/issues/logic/action/action.py b/ckanext/issues/logic/action/action.py index 8c1c79cc..3bc17519 100644 --- a/ckanext/issues/logic/action/action.py +++ b/ckanext/issues/logic/action/action.py @@ -141,6 +141,7 @@ def _get_issue_vars(issue, issue_subject, user_obj, recipient): 'dataset': model.Package.get(issue.dataset_id), 'user': user_obj, 'site_title': get_site_title(), + 'site_url': config.get('ckan.site_url', ''), 'recipient': recipient, 'h': h} @@ -467,15 +468,26 @@ def issue_comment_create(context, data_dict): if notifications: dataset = model.Package.get(data_dict['dataset_id']) recipients = _get_recipients(context, dataset) - subject = get_issue_subject(issue.as_dict()) + # subject = get_issue_subject(issue.as_dict()) + subject = issue.title for recipient in recipients: body = _get_comment_email_body( issue_comment, subject, user_obj, recipient) - user_obj = model.User.get(recipient['user_id']) + user_recipient = model.User.get(recipient['user_id']) try: - mailer.mail_user(user_obj, subject, body) + mailer.mail_user(user_recipient, subject, body) + except (mailer.MailerException, TypeError), e: + # TypeError occurs when we're running command from ckanapi + log.debug(e.message) + + # Sending email to author + if user_obj.id != issue.user.id: + body = _get_comment_email_body( + issue_comment, subject, user_obj, {}) + try: + mailer.mail_user(issue.user, subject, body) except (mailer.MailerException, TypeError), e: # TypeError occurs when we're running command from ckanapi log.debug(e.message) diff --git a/ckanext/issues/model/__init__.py b/ckanext/issues/model/__init__.py index 2a8e9e86..4a3aac12 100644 --- a/ckanext/issues/model/__init__.py +++ b/ckanext/issues/model/__init__.py @@ -223,7 +223,7 @@ def apply_filters_to_an_issue_query(cls, query = query.filter(model.Package.owner_org == org.id) if q: - search_expr = '%{0}%'.format(q) + search_expr = u'%{0}%'.format(q) query = query.filter(or_(cls.title.ilike(search_expr), cls.description.ilike(search_expr))) @@ -469,7 +469,7 @@ def clear_all_abuse_reports(self, session): Column('name', types.Unicode(ISSUE_CATEGORY_NAME_MAX_LENGTH), nullable=False, unique=True), Column('description', types.Unicode, nullable=False, unique=False), - Column('created', types.DateTime, default=datetime.now, + Column('created', types.DateTime, default=datetime.utcnow, nullable=False)) issue_table = Table( @@ -486,7 +486,7 @@ def clear_all_abuse_reports(self, session): Column('status', types.String(15), default=ISSUE_STATUS.open, nullable=False), Column('resolved', types.DateTime), - Column('created', types.DateTime, default=datetime.now, + Column('created', types.DateTime, default=datetime.utcnow, nullable=False), Column('visibility', types.Unicode, default=u'visible'), Column('abuse_status', @@ -505,7 +505,7 @@ def clear_all_abuse_reports(self, session): Column('issue_id', types.Integer, ForeignKey('issue.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False, index=True), - Column('created', types.DateTime, default=datetime.now, + Column('created', types.DateTime, default=datetime.utcnow, nullable=False), Column('visibility', types.Unicode, default=u'visible'), Column('abuse_status', diff --git a/ckanext/issues/plugin.py b/ckanext/issues/plugin.py index e3688bc9..9b8ed1d5 100644 --- a/ckanext/issues/plugin.py +++ b/ckanext/issues/plugin.py @@ -10,7 +10,17 @@ # Imports are done in methods to speed up paster. # Please don't move back up to here. -class IssuesPlugin(p.SingletonPlugin): +if toolkit.check_ckan_version(min_version='2.5'): + from ckan.lib.plugins import DefaultTranslation + + class IssuesPluginBase(p.SingletonPlugin, DefaultTranslation): + p.implements(p.ITranslation, inherit=True) +else: + class IssuesPluginBase(p.SingletonPlugin): + pass + + +class IssuesPlugin(IssuesPluginBase): """ CKAN Issues Extension """ diff --git a/ckanext/issues/public/css/ckanext-issues/style.css b/ckanext/issues/public/css/ckanext-issues/style.css index 897939c2..7d8db3b7 100644 --- a/ckanext/issues/public/css/ckanext-issues/style.css +++ b/ckanext/issues/public/css/ckanext-issues/style.css @@ -1,9 +1,13 @@ /***************************************** Issue Show - ****************************************/ + ****************************************/ .issue-header { - margin-bottom: 15px; + margin-bottom: 35px; +} + +h1.page-heading .issues-actions .btn { + font-size: 15px; } .issue-header h1.page-heading { @@ -17,16 +21,16 @@ .issue-header-meta { margin-top: 9px; - font-size: 14px; + font-size: 100%; line-height: 28px; color: #777; padding-bottom: 20px; - border-bottom: 1px solid #eee; + border-bottom: 1px solid #2d5ca6; } .issue-header-status { - padding: 6px 12px; - margin-right: 8px; + padding: 6px 8px; + margin-right: 10px; font-size: 14px; font-weight: bold; line-height: 20px; @@ -35,27 +39,27 @@ } .issue-header-status.open { - background-color: #6cc644; + background-color: #449d44; } .issue-header-status.closed { - background-color: red; + background-color: #c9302c; } .issue-comment-wrapper { position: relative; padding-left: 64px; - margin-top: 15px; - margin-bottom: 15px; - border-top: 2px solid #fff; - border-bottom: 2px solid #fff; + padding-bottom: 25px; + margin-bottom: 25px; + border-bottom: 1px solid #d5deed; +} + +.issue-comment-wrapper:last-of-type { + border-bottom: none; } .issue-comment { position: relative; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; } .issue-comment-avatar { @@ -65,18 +69,11 @@ } .issue-comment-header { - padding-left: 15px; - padding-right: 10px; - color: #777; - background-color: #f7f7f7; - border-bottom: 1px solid #eee; - border-top-left-radius: 4px; - border-top-right-radius: 4px; + } .issue-comment-header .author { - font-weight: bold; - color: #555; + color: #2d5ca6; } .issue-comment-header .issue-comment-actions .issue-comment-action { @@ -107,23 +104,21 @@ } .issue-comment-action { - margin-top: 8px; padding-left: 5px; + margin-top: -2px; } .issue-header-text { max-width: 78%; - padding-top: 10px; - padding-bottom: 10px; + margin-bottom: 10px; + color: #818181; } .issue-comment-content { - padding: 15px; - font-size: 14px + font-size: 100%; } .issue-comment-new { - border-top: 2px solid #f3f3f3; background-color: #fff; } @@ -137,18 +132,53 @@ } .issue-comment-label { - float: right; - margin: 8px 5px 0px 10px; - padding: 2px 5px; - font-size: 12px; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 3px; + display: inline-block; + padding: 2px 7px; + font-size: 12px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; +} + +.list-group-item .issue-comment-label { + margin-top: 5px; +} + +.issue-comment-wrapper .issue-comment-label { + float: right; } .issue-abuse { color: #b0b0b0; } +.issue-comment-footer { + margin-top: 10px; + font-size: 80%; +} + +.issue-comment-footer .issue-comment-action { + margin-bottom: 5px; + margin-top: 0px; + padding-left: 0px; + display: inline-block; +} + +.issue-comment-footer .issue-comment-action .link-button { + border: none; + padding: 0px; + margin-right: 10px; + color: #2d5ca6; +} + +.issue-comment-footer .issue-comment-action .link-button:hover { + color: #23527c; +} + +.issue-comment-footer .issue-comment-label { + margin-bottom: 5px; + float: none; +} + /***************************************** Issue homes - dataset, organization, all ****************************************/ @@ -181,29 +211,26 @@ margin-bottom: -1px; } -.list-group-item:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - .list-group-item { position: relative; display: block; - margin-bottom: -1px; - padding: 8px 10px 10px 40px; - border: 1px solid #e5e5e5; + margin-bottom: 25px; + padding: 0px 10px 20px 35px; + border: none; + border-bottom: 1px solid #d5deed; } .list-group-item-name { margin: 0 60px 0 0; - font-size: 15px; + font-size: 120%; line-height: 1.3; margin-bottom: 2px; word-wrap: break-word; + letter-spacing: 0px; } .list-group-item-meta { - font-size: 11px; + font-size: 90%; line-height: 17px; list-style-type: none; overflow: hidden; @@ -217,7 +244,7 @@ .list-group-item-meta>li { display: inline-block; - margin-right: 4px; + margin-right: 10px; } .list-group-item-number { @@ -231,6 +258,7 @@ .list-group-item-name .icon { float: left; + margin-top: 1px; margin-left: -24px; font-size: 16px; line-height: 1; @@ -240,7 +268,7 @@ } .list-group-item-name .icon.open { - color: #6cc644; + color: #449d44; } .list-group-item-name .icon.abuse { @@ -248,7 +276,11 @@ } .list-group-item-name .icon.closed { - color: #fe4c30; + color: #c9302c; +} + +#issue-list { + margin-top: 25px; } /* Sidebar */ @@ -262,3 +294,16 @@ margin-right: -15px; margin-bottom: 0px; } + +#ckanext-issues-assign .select2-container { + min-width: 100%; + width: 100% !important; + margin-bottom: 10px; +} + +#ckanext-issues-assignee img { + position: relative; + top: 1px; + width: 15px; + height: 15px; +} diff --git a/ckanext/issues/templates/issues/add.html b/ckanext/issues/templates/issues/add.html index bdee15ea..645d4779 100644 --- a/ckanext/issues/templates/issues/add.html +++ b/ckanext/issues/templates/issues/add.html @@ -15,8 +15,8 @@

{{ _('The form contains invalid entries:') }}

    -set {% for key, error in c.error_summary.items() %} -
  • {{ key }}: {{ error[0] }}
  • + {% for key, error in c.error_summary.items() %} +
  • {{ _(key) }}: {{ _(error[0]) }}
  • {% endfor %}
diff --git a/ckanext/issues/templates/issues/all_issues.html b/ckanext/issues/templates/issues/all_issues.html index 54884448..447e9d61 100644 --- a/ckanext/issues/templates/issues/all_issues.html +++ b/ckanext/issues/templates/issues/all_issues.html @@ -21,5 +21,5 @@ {% endblock %} {% block no_issues %} - There are currently no issues + {% trans %}There are currently no issues{% endtrans %} {% endblock %} diff --git a/ckanext/issues/templates/issues/base_form_page.html b/ckanext/issues/templates/issues/base_form_page.html index 5b2d7957..bad1dc9a 100644 --- a/ckanext/issues/templates/issues/base_form_page.html +++ b/ckanext/issues/templates/issues/base_form_page.html @@ -11,11 +11,9 @@

{% block page_heading %}{% endblock %}

{% block secondary_content %}
-

{{ _('What are issues?') }}

+

{{ _('What are issues?') }}

- {% trans %} -

Issues are ... .

- {% endtrans %} +

{% trans %}Issues are the system for getting feedback about datasets.{% endtrans %}

{% endblock %} diff --git a/ckanext/issues/templates/issues/common.html b/ckanext/issues/templates/issues/common.html index 2cbcaca4..0094ff74 100644 --- a/ckanext/issues/templates/issues/common.html +++ b/ckanext/issues/templates/issues/common.html @@ -1,44 +1,41 @@ {% macro issue_item(issue, pkg, current_user) -%}
  • #{{issue.number}} - {% set reported_by_current_user = h.issues_user_has_reported_issue(current_user, issue.abuse_reports) %} - {% if issue.visibility == 'hidden' %} -
    - Spam/Abuse - hidden from normal users -
    - {% elif reported_by_current_user %} -
    - Reported by you to admins -
    - {% endif%}

    {% set issue_icon = 'abuse' if issue.visibility == 'hidden' else issue.status %} - + {{issue.title}}

    + {% set reported_by_current_user = h.issues_user_has_reported_issue(current_user, issue.abuse_reports) %} + {% if issue.visibility == 'hidden' %} +
    + {% trans %}Spam/Abuse - hidden from normal users{% endtrans %} +
    + {% elif reported_by_current_user %} +
    + {% trans %}Reported by you to admins{% endtrans %} +
    + {% endif%}
  • {%- endmacro %} {% macro search_options_sidebar(user_can_change_visibility, url_params) -%}

    - - Status + {% trans %}Status{% endtrans %}

    {% if user_can_change_visibility %}

    - - Visibility + {% trans %}Visibility{% endtrans %}

    - {% snippet 'snippets/search_form.html', type='issue', query=q, fields=(('page', pagination.page), ('per_page', pagination.per_page), ('status', status), ('visibility', visibility)), sorting=filters, sorting_selected=sort, placeholder=_('Search issues...'), no_bottom_border=true, no_title=true %} -

    - {{ ungettext('{number} issue found', '{number} issues found', pagination.total_count) .format(number=pagination.total_count) }} -

    + {% snippet 'snippets/search_form.html', type='issue', count=pagination.total_count, query=q, fields=(('page', pagination.page), ('per_page', pagination.per_page), ('status', status), ('visibility', visibility)), sorting=filters, sorting_selected=sort, placeholder=_('Search issues...'), no_bottom_border=true, no_title=true %}
    {% if issues %}
      diff --git a/ckanext/issues/templates/issues/email/new_comment.html b/ckanext/issues/templates/issues/email/new_comment.html index 7c966e0e..f520a861 100644 --- a/ckanext/issues/templates/issues/email/new_comment.html +++ b/ckanext/issues/templates/issues/email/new_comment.html @@ -1,20 +1,17 @@ -A user '{{ user.fullname }}' has added a comment to one of your issues on {{ site_title }}. - -The dataset is: {{ dataset.title }} -The issue is: {{ issue_subject }} -The comment is: +{% trans %}A user {% endtrans %} {{ user.fullname or user.name }} {% trans %}has added a comment to one of your issues on {% endtrans %} {{ site_title }}. +{% trans %}The dataset is{% endtrans %}: {{ dataset.title }} +{% trans %}The issue is{% endtrans %}: {{ issue_subject }} +{% trans %}The comment is{% endtrans %}: > {{ comment.comment|wordwrap(width=76)|replace('\n', '\n> '|safe) }} -In order to respond to the comment, please see the issue at: {{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }}. Once the issue has been resolved, click 'Close issue'. +{% trans %}In order to respond to the comment, please see the issue at{% endtrans %}: {{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }}. +{% trans %}Once the issue has been resolved, click 'Close issue'.{% endtrans %} -Thank you, +{% trans %}Thank you{% endtrans %} -The {{ site_title }} team +{% trans %}The{% endtrans %} {{ site_title }} {% trans %}team{% endtrans %} -- - -Issue: {{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }} -Dataset: {{ h.url_for('dataset_read', id=dataset.name, qualified=True) }} - +{% trans %}Message sent by{% endtrans %} {{ site_title }} ({{ site_url }}) diff --git a/ckanext/issues/templates/issues/email/new_issue.html b/ckanext/issues/templates/issues/email/new_issue.html index 12eedb38..9f34e29e 100644 --- a/ckanext/issues/templates/issues/email/new_issue.html +++ b/ckanext/issues/templates/issues/email/new_issue.html @@ -1,19 +1,20 @@ -On {{ site_title }} a user has raised an issue with one of the datasets from organization '{{ recipient.organization_title }}', for which you are an {{ recipient.capacity }}.' for which you are an {{ capacity }}. -The dataset is: {{ dataset.title }} -The issue is: +{% trans %}On open data portal{% endtrans %} {{ site_title }} {% trans %} a user has raised an issue with one of the datasets from organization{% endtrans %} '{{ recipient.organization_title }}', {% trans %}for which you are an{% endtrans %} {{ recipient.capacity }}. + +{% trans %}The dataset is: {% endtrans %}{{ dataset.title }} + +{% trans %}The issue is:{% endtrans %} > {{ issue_subject|wordwrap(width=76)|replace('\n', '\n> '|safe) }} > {{ issue.description|wordwrap(width=76)|replace('\n', '\n> '|safe) }} -Please correct the problem or add an initial comment about the issue at: {{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }}. Once the issue has been resolved, click 'Close issue'. +{% trans %}Please correct the problem or add an initial comment about the issue at: {% endtrans %}{{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }}. {% trans %}Once the issue has been resolved, click 'Close issue'.{% endtrans %} -Thank you, +{% trans %}Thank you,{% endtrans %} -The {{ site_title }} team +{% trans %}The{% endtrans %} {{ site_title }} {% trans %}team{% endtrans %} -- -Issue: {{ h.url_for('issues_show', dataset_id=dataset.name, issue_number=issue.number, qualified=True) }} -Dataset: {{ h.url_for('dataset_read', id=dataset.name, qualified=True) }} -User: {{ user.fullname or user.name }} \ No newline at end of file +{% trans %}Message sent by{% endtrans %} {{ site_title }} ({{ site_url }}) + diff --git a/ckanext/issues/templates/issues/show.html b/ckanext/issues/templates/issues/show.html index ae41f2f1..c53bcb96 100644 --- a/ckanext/issues/templates/issues/show.html +++ b/ckanext/issues/templates/issues/show.html @@ -39,6 +39,7 @@
      {{ h.render_markdown(issue.comment) }}
      + {{ issue_or_comment_footer(issue_or_comment=issue, dataset=dataset, issue=issue, header_is_for_issue=True, can_edit_issue=can_edit_issue) }} {% endmacro %} @@ -54,6 +55,7 @@
      {{ h.render_markdown(comment.comment) }}
      + {{ issue_or_comment_footer(issue_or_comment=comment, dataset=dataset, issue=issue, header_is_for_issue=False, can_edit_issue=can_edit_issue) }} {% endmacro %} @@ -64,113 +66,116 @@ {% if header_is_for_issue and can_edit_issue %} {% endif %} - {% if c.user and not can_edit_issue %} - {# a normal user can report this comment/issue #} - {% set reported_by_current_user = h.issues_user_has_reported_issue(c.user, issue_or_comment.abuse_reports) %} - {% if not reported_by_current_user %} -
      - {% if header_is_for_issue %} -
      - {% else %} - - {% endif %} - -
      -
      - {% else %} -
      - {% if header_is_for_issue %} -
      - {% else %} - - {% endif %} - -
      -
      - {% endif %} - {% elif c.user %} - {# i.e. an admin, so allow moderation #} - {% set reports_by_users = issue_or_comment.abuse_reports|length %} - {# always offer the "this is spam" button #} -
      - {% if header_is_for_issue %} -
      - {% else %} - - {% endif %} - -
      -
      - {# only offer the "this isn't spam" button if it has been marked as spam by users or moderator and therefore it might need denying or cancelling #} - {% if (reports_by_users or issue_or_comment.visibility != 'visible') %} -
      - {% if header_is_for_issue %} -
      - {% else %} - - {% endif %} - -
      -
      - {% endif %} - {% if reports_by_users %} -
      - {{ reports_by_users }} user reports this is spam/abuse -
      - {% endif %} - {% if issue_or_comment.visibility != 'visible' %} -
      - Hidden from normal users -
      - {% endif %} - {% if issue_or_comment.abuse_status != 'unmoderated' %} -
      - Moderated: {{ issue_or_comment.abuse_status }} -
      - {% endif %} - {% endif %} {% if h.issues_user_is_owner(user=issue_or_comment.user, dataset_id=dataset.id) %}
      - Owner + {% trans %}Owner{% endtrans %}
      {% endif %}
      {{ issue_or_comment.user.name}} - commented + {% trans %}commented{% endtrans %} {{ h.time_ago_from_timestamp(issue_or_comment.created).lower() }}
      {% endmacro %} +{%- macro issue_or_comment_footer(issue_or_comment, dataset, issue, header_is_for_issue, can_edit_issue) %} + +{% endmacro %} + {% block primary_content %}

      {{issue.title}} - #{{issue.number}} + #{{issue.number}}

      - {{issue.status.title()}} + {{ _(issue.status.title()) }} - {{issue.user.name}} opened this issue {{issue.time_ago}} · + {{issue.user.name}} {% trans %}opened this issue{% endtrans %} {{issue.time_ago}} · {{ ungettext('{number} comment', '{number} comments', comment_count).format(number=comment_count) }}
      @@ -188,7 +193,7 @@

      {% if c.user %} - {{c.current_user.gravatar}} + {{ h.gravatar((c.userobj.email_hash), size=48) }}
      - You can use Markdown formatting here + {% trans %}You can use Markdown formatting here{% endtrans %}
      {% block form_actions %}
      {% if h.check_access('issue_delete', {'issue_number': issue.number, 'dataset_id': dataset.id}) %} {% set locale = h.dump_json({'content': _('Are you sure you want to delete this issue?')}) %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} + {{ _('Delete') }} {% endif %} - {% if can_edit_issue %} + {# If user can delete issue then he can change status #} + {% if h.check_access('issue_delete', {'issue_number': issue.number, 'dataset_id': dataset.id}) %} {% if issue.status == 'open' %}
      - {% endif %} - {% endblock %} + {% endif %} + {% endblock %} +

      + + {% endblock %} diff --git a/ckanext/issues/templates/snippets/search_result_text.html b/ckanext/issues/templates/snippets/search_result_text.html index 5a4ea0de..aae88f4e 100644 --- a/ckanext/issues/templates/snippets/search_result_text.html +++ b/ckanext/issues/templates/snippets/search_result_text.html @@ -1,4 +1,5 @@ {% if type == 'issue' %} + {% set count=count if count else 0 %} {% set text_query = ungettext('{number} issue found for "{query}"', '{number} issues found for "{query}"', count) %} {% set text_query_none = _('No issues found for "{query}"') %} {% set text_no_query = ungettext('{number} issue found', '{number} issues found', count) %} diff --git a/setup.cfg b/setup.cfg index a7aa1543..f1afd8b7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,27 @@ [nosetests] with-pylons=test.ini + +[extract_messages] +keywords = translate isPlural +add_comments = TRANSLATORS: +output_file = ckanext/issues/i18n/ckanext-issues.pot +width = 80 + +[init_catalog] +domain = ckanext-issues +input_file = ckanext/issues/i18n/ckanext-issues.pot +output_dir = ckanext/issues/i18n + +[update_catalog] +domain = ckanext-issues +input_file = ckanext/issues/i18n/ckanext-issues.pot +output_dir = ckanext/issues/i18n +previous = true + +[compile_catalog] +domain = ckanext-issues +directory = ckanext/issues/i18n +statistics = true + +[upload_sphinx] +upload-dir = build/sphinx/html \ No newline at end of file diff --git a/setup.py b/setup.py index 24a48784..b5b5b103 100644 --- a/setup.py +++ b/setup.py @@ -30,5 +30,20 @@ [paste.paster_command] issues = ckanext.issues.commands:Issues + + [babel.extractors] + ckan = ckan.lib.extract:extract_ckan """, + # If you are changing from the default layout of your extension, you may + # have to change the message extractors, you can read more about babel + # message extraction at + # http://babel.pocoo.org/docs/messages/#extraction-method-mapping-and-configuration + message_extractors={ + 'ckanext': [ + ('**.py', 'python', None), + ('**.js', 'javascript', None), + ('**/templates/**.html', 'ckan', None), + ], + } ) +