diff --git a/.gitignore b/.gitignore index 206bfb5..ba3299b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,13 @@ /local.cfg .coverage /*.egg-info +/*.egg /.installed.cfg *.pyc /.Python /include /lib +/local /.project /.pydevproject /.mr.developer.cfg diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..70f96b4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,19 @@ +language: python +python: "2.7" +sudo: false +cache: + directories: + - eggs +before_install: + - pip install http://effbot.org/downloads/Imaging-1.1.7.tar.gz +install: + - mkdir -p buildout-cache/eggs + - mkdir -p buildout-cache/downloads + - python bootstrap-buildout.py --setuptools-version=8.3 -c travis.cfg + - bin/buildout -N -t 3 -c travis.cfg +script: + - bin/code-analysis +# - bin/test-coverage +#after_success: +# - pip install -q coveralls +# - coveralls diff --git a/CHANGES.rst b/CHANGES.rst index 61ff6fa..437ae9a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,12 +1,113 @@ Changelog ========= -2.3.0 (unreleased) +2.4.0 (unreleased) ------------------ - Rename @@discussion-settings to @@discussion-controlpanel [maartenkling] +- Add permission to allow comment authors to delete their own comments if + there are no replies yet. + [gaudenz] + +- Updated portuguese pt-br translation. + [jtmolon] + +- Read mail settings from new (Plone 5) registry. + [timo] + + +2.3.3 (2014-10-23) +------------------ + +- Don't execute createReplyForm js if there is no in_reply_to button. + [vincentfretin] + +- Register events as Content Rules Event Types if plone.contentrules is present + [avoinea] + +- Trigger custom events on comment add/remove/reply + [avoinea] + +- Replace $.live with $.on for jQuery >= 1.9 compatibility. This works on + jQuery >= 1.7 (Plone 4.3 onwards). + [gaudenz] + +- Update Traditional Chinese translations. + [marr] + +- Make comments editable. + [pjstevns, gyst] + +- Provide 'Delete comments' permission to handle comments deletion + [cekk] + +- Fixed Italian translations [cekk] + + +2.3.2 (2014-04-05) +------------------ + +- bugfix: according to IDiscussionSettings.anonymous_email_enabled (cite): + "If selected, anonymous user will have to give their email." - But field + was not required. Now it is. + [jensens] + +- bugfix: anonymous email field was never saved. + [jensens] + +- updated german translations: added some missing msgstr. + [jensens] + +- added i18ndude and a script ``update_translations`` to buildout in order + to make translation updates simpler. + [jensens] + +- Fix reindexObject for content_object in moderation views. + Now reindex only "total_comments" index and not all the indexes + [cekk] + +- Fix comments Title if utf-8 characters in author_name + [huub_bouma] + +- use member.getId as author_username, so membrane users having different id + then username still have there picture shown and author path is correct. + [maartenkling] + + +2.3.1 (2014-02-22) +------------------ + +- 2.3.0 was a brown bag release. + [timo] + + +2.3.0 (2014-02-22) +------------------ + +- Remove DL's from portal message in templates. + https://github.com/plone/Products.CMFPlone/issues/153 + [khink] + +- Execute the proper workflow change when using the moderation buttons instead + of hardcoding the workflow action to always publish + [omiron] + +- Corrections and additions to the Danish translation + [aputtu] + + +2.2.12 (2014-01-13) +------------------- + +- Show author email to Moderator when it is available in anonymous comment. + [gotcha, smoussiaux] + +- Put defaultUser.png instead of old defaultUser.gif + [bsuttor] + +>>>>>>> master - Remove bbb directory. bbb was never really implemented. [timo] @@ -20,7 +121,9 @@ Changelog PLONE_FIXTURE. [timo] -- Fix ownership of comments. [toutpt] +- Fix ownership of comments. + [toutpt] + 2.2.10 (2013-09-24) ------------------- @@ -109,6 +212,7 @@ Changelog - Updated Ukrainian translation [kroman0] + 2.2.3 (2013-01-13) ------------------ @@ -116,6 +220,7 @@ Changelog the email field on comment add form when anonymous. [toutpt] + 2.2.2 (2012-11-16) ------------------ @@ -127,8 +232,8 @@ Changelog 2.2.1 (2012-11-16) ------------------ -- Make conversation view not break when comment-id cannot be converted to long. - Fixes #13327 +- Make conversation view not break when comment-id cannot be converted to + long. This fixes #13327 [khink] - fix insufficient privileges when trying to view diff --git a/MANIFEST.in b/MANIFEST.in index e0cdcf4..f3e0bd5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ include *.txt +include *.rst recursive-include docs * recursive-include plone * diff --git a/bootstrap.py b/bootstrap-buildout.py similarity index 72% rename from bootstrap.py rename to bootstrap-buildout.py index 1b28969..a629566 100644 --- a/bootstrap.py +++ b/bootstrap-buildout.py @@ -35,7 +35,7 @@ Bootstraps a buildout-based project. Simply run this script in a directory containing a buildout.cfg, using the Python that you want bin/buildout to use. -Note that by using --find-links to point to local resources, you can keep +Note that by using --find-links to point to local resources, you can keep this script from going over the network. ''' @@ -56,6 +56,11 @@ parser.add_option("-c", "--config-file", "file to be used.")) parser.add_option("-f", "--find-links", help=("Specify a URL to search for buildout releases")) +parser.add_option("--allow-site-packages", + action="store_true", default=False, + help=("Let bootstrap.py use existing site packages")) +parser.add_option("--setuptools-version", + help="use a specific setuptools version") options, args = parser.parse_args() @@ -63,32 +68,42 @@ options, args = parser.parse_args() ###################################################################### # load/install setuptools -to_reload = False try: - import pkg_resources - import setuptools + if options.allow_site_packages: + import setuptools + import pkg_resources + from urllib.request import urlopen except ImportError: - ez = {} + from urllib2 import urlopen - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen +ez = {} +exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez) - # XXX use a more permanent ez_setup.py URL when available. - exec(urlopen('https://bitbucket.org/pypa/setuptools/raw/0.7.2/ez_setup.py' - ).read(), ez) - setup_args = dict(to_dir=tmpeggs, download_delay=0) - ez['use_setuptools'](**setup_args) +if not options.allow_site_packages: + # ez_setup imports site, which adds site packages + # this will remove them from the path to ensure that incompatible versions + # of setuptools are not in the path + import site + # inside a virtualenv, there is no 'getsitepackages'. + # We can't remove these reliably + if hasattr(site, 'getsitepackages'): + for sitepackage_path in site.getsitepackages(): + sys.path[:] = [x for x in sys.path if sitepackage_path not in x] - if to_reload: - reload(pkg_resources) - import pkg_resources - # This does not (always?) update the default working set. We will - # do it. - for path in sys.path: - if path not in pkg_resources.working_set.entries: - pkg_resources.working_set.add_entry(path) +setup_args = dict(to_dir=tmpeggs, download_delay=0) + +if options.setuptools_version is not None: + setup_args['version'] = options.setuptools_version + +ez['use_setuptools'](**setup_args) +import setuptools +import pkg_resources + +# This does not (always?) update the default working set. We will +# do it. +for path in sys.path: + if path not in pkg_resources.working_set.entries: + pkg_resources.working_set.add_entry(path) ###################################################################### # Install buildout @@ -119,10 +134,15 @@ if version is None and not options.accept_buildout_test_releases: _final_parts = '*final-', '*final' def _final_version(parsed_version): - for part in parsed_version: - if (part[:1] == '*') and (part not in _final_parts): - return False - return True + try: + return not parsed_version.is_prerelease + except AttributeError: + # Older setuptools + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + index = setuptools.package_index.PackageIndex( search_path=[setuptools_path]) if find_links: @@ -149,8 +169,7 @@ cmd.append(requirement) import subprocess if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0: raise Exception( - "Failed to execute command:\n%s", - repr(cmd)[1:-1]) + "Failed to execute command:\n%s" % repr(cmd)[1:-1]) ###################################################################### # Import and run buildout diff --git a/buildout.cfg b/buildout.cfg index 0b66ca6..b9a690e 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,44 @@ [buildout] -extends = https://raw.github.com/collective/buildout.plonetest/master/test-4.3.x.cfg -package-name = plone.app.discussion -package-extras = [test] -parts += +extends = http://dist.plone.org/release/4.3.4/versions.cfg +parts = + instance + test + coverage + test-coverage mkrelease pocompile + code-analysis + i18ndude + update_translations +develop = . + +[instance] +recipe = plone.recipe.zope2instance +http-address = 8080 +user = admin:admin +eggs = Plone + + +[test] +recipe = zc.recipe.testrunner +eggs = plone.app.discussion [test] +defaults = ['-s', 'plone.app.discussion', '--auto-color', '--auto-progress'] + +[coverage] +recipe = zc.recipe.egg +eggs = coverage + +[test-coverage] +recipe = collective.recipe.template +input = inline: + #!/bin/bash + ${buildout:directory}/bin/coverage run --source=${buildout:directory}/src/plone/app/discussion bin/test + ${buildout:directory}/bin/coverage html + ${buildout:directory}/bin/coverage report -m --fail-under=100 + # Fail (exit status 1) if coverage returns exit status 2 (this happens + # when test coverage is below 100%. +output = ${buildout:directory}/bin/test-coverage +mode = 755 [mkrelease] recipe = zc.recipe.egg @@ -14,7 +48,41 @@ eggs = jarn.mkrelease recipe = zc.recipe.egg eggs = zest.pocompile +[code-analysis] +recipe = plone.recipe.codeanalysis +directory = ${buildout:directory}/plone/app/discussion +flake8-max-complexity = 50 + +[i18ndude] +recipe = zc.recipe.egg +eggs = + i18ndude + +[update_translations] +recipe = collective.recipe.template +output = ${buildout:bin-directory}/update_translations +input = inline: + #!/usr/bin/env bash + + DOMAIN="plone.app.discussion" + BASE_PATH=${buildout:directory}/plone/app/discussion + I18NDUDE=${buildout:bin-directory}/i18ndude + + $I18NDUDE rebuild-pot --pot $BASE_PATH/locales/$DOMAIN.pot --create "$DOMAIN" $BASE_PATH* + $I18NDUDE rebuild-pot --pot $BASE_PATH/i18n/plone.pot --create "plone" $BASE_PATH/profiles/ + + for LANG in `find $BASE_PATH/locales -maxdepth 1 -mindepth 1 -type d \ + | sed -e "s/.*locales\/\(.*\)$/\1/"`; do + $I18NDUDE sync --pot $BASE_PATH/locales/$DOMAIN.pot $BASE_PATH/locales/de/LC_MESSAGES/$DOMAIN.po + msgfmt --no-hash -o $BASE_PATH/locales/$LANG/LC_MESSAGES/$DOMAIN.mo $BASE_PATH/locales/$LANG/LC_MESSAGES/$DOMAIN.po + + $I18NDUDE sync --pot $BASE_PATH/i18n/plone.pot $BASE_PATH/i18n/plone-$LANG.po + msgfmt --no-hash -o $BASE_PATH/i18n/plone-$LANG.mo $BASE_PATH/i18n/plone-$LANG.po + done +mode = 755 + [versions] plone.app.discussion = zope.interface = 4.0.5 - +zc.buildout = 2.3.1 +setuptools = 8.0.4 diff --git a/docs/README.txt b/docs/README.txt index e07e9b4..58475f7 100644 --- a/docs/README.txt +++ b/docs/README.txt @@ -1,2 +1,2 @@ -For developers documentation on plone.app.discussion, see +For developers documentation on plone.app.discussion, see http://packages.python.org/plone.app.discussion. \ No newline at end of file diff --git a/docs/source/changes.txt b/docs/source/changes.txt deleted file mode 100644 index a3e71a0..0000000 --- a/docs/source/changes.txt +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../CHANGES.txt \ No newline at end of file diff --git a/docs/source/index.txt b/docs/source/index.txt index f09b01f..c8def7f 100644 --- a/docs/source/index.txt +++ b/docs/source/index.txt @@ -21,7 +21,6 @@ Contents: email-notification.txt api/index.txt howtos/index.txt - changes.txt diff --git a/jenkins.cfg b/jenkins.cfg deleted file mode 100644 index 209b2f4..0000000 --- a/jenkins.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[buildout] -extends = - https://raw.github.com/collective/buildout.plonetest/master/plone-4.3.x.cfg - https://raw.github.com/plone/buildout.jenkins/master/jenkins.cfg - https://raw.github.com/plone/buildout.jenkins/master/jenkins-code-analysis.cfg -jenkins-test-eggs = plone.app.discussion [test] -jenkins-test-directories = plone/app/discussion -parts += - flake8 - code-analysis -extensions = mr.developer -auto-checkout = - plone.recipe.codeanalysis - collective.xmltestreport - -[flake8] -recipe = zc.recipe.egg -eggs = flake8 -entry-points = flake8=flake8.main:main - -[code-analysis] -recipe = plone.recipe.codeanalysis - -[sources] -plone.recipe.codeanalysis = git git://github.com/tisto/plone.recipe.codeanalysis.git pushurl=git@github.com:tisto/plone.recipe.codeanalysis.git -collective.xmltestreport = git git://github.com/collective/collective.xmltestreport.git - -[versions] -plone.app.discussion = -zope.interface = 3.6.1 -zc.buildout = 2.1.0 -zc.recipe.egg = 2.0.0 diff --git a/plone/app/discussion/browser/comment.py b/plone/app/discussion/browser/comment.py index 97eec23..03e0732 100644 --- a/plone/app/discussion/browser/comment.py +++ b/plone/app/discussion/browser/comment.py @@ -1,8 +1,16 @@ from Acquisition import aq_inner, aq_parent +from AccessControl import getSecurityManager +from zope.component import getMultiAdapter +from Products.statusmessages.interfaces import IStatusMessage from Products.Five.browser import BrowserView from Products.CMFCore.utils import getToolByName +from plone.app.discussion import PloneAppDiscussionMessageFactory as _ +from comments import CommentForm +from z3c.form import button +from plone.z3cform.layout import wrap_form + class View(BrowserView): """Comment View. @@ -37,3 +45,64 @@ class View(BrowserView): url = "%s/view" % url self.request.response.redirect('%s#%s' % (url, context.id)) + + +class EditCommentForm(CommentForm): + """Form to edit an existing comment.""" + ignoreContext = True + id = "edit-comment-form" + label = _(u'edit_comment_form_title', default=u'Edit comment') + + def updateWidgets(self): + super(EditCommentForm, self).updateWidgets() + self.widgets['text'].value = self.context.text + # We have to rename the id, otherwise TinyMCE can't initialize + # because there are two textareas with the same id. + self.widgets['text'].id = 'overlay-comment-text' + + def _redirect(self, target=''): + if not target: + portal_state = getMultiAdapter((self.context, self.request), + name=u'plone_portal_state') + target = portal_state.portal_url() + self.request.response.redirect(target) + + @button.buttonAndHandler(_(u"edit_comment_form_button", + default=u"Edit comment"), name='comment') + def handleComment(self, action): + + # Validate form + data, errors = self.extractData() + if errors: + return + + # Check permissions + can_edit = getSecurityManager().checkPermission( + 'Edit comments', + self.context) + mtool = getToolByName(self.context, 'portal_membership') + if mtool.isAnonymousUser() or not can_edit: + return + + # Update text + self.context.text = data['text'] + + # Redirect to comment + IStatusMessage(self.request).add(_(u'comment_edit_notification', + default="Comment was edited"), + type='info') + return self._redirect( + target=self.action.replace("@@edit-comment", "@@view")) + + @button.buttonAndHandler(_(u'cancel_form_button', + default=u'Cancel'), name='cancel') + def handle_cancel(self, action): + IStatusMessage(self.request).add( + _(u'comment_edit_cancel_notification', + default=u'Edit comment cancelled'), + type='info') + return self._redirect(target=self.context.absolute_url()) + +EditComment = wrap_form(EditCommentForm) + +#EOF diff --git a/plone/app/discussion/browser/comments.pt b/plone/app/discussion/browser/comments.pt index c192e7a..8e69b15 100644 --- a/plone/app/discussion/browser/comments.pt +++ b/plone/app/discussion/browser/comments.pt @@ -1,6 +1,8 @@ @@ -42,14 +46,14 @@
- - + + +
+
+ +
+ +
-
-
+ Warning -
-
+ + You have comments that have not been migrated to the new commenting system that has been introduced in Plone 4.1. Please @@ -77,8 +77,8 @@ >migrate your comments to fix this. -
-
+ +
Portal status message @@ -99,6 +99,6 @@
- + diff --git a/plone/app/discussion/browser/controlpanel.py b/plone/app/discussion/browser/controlpanel.py index 72c611d..9ad0bca 100644 --- a/plone/app/discussion/browser/controlpanel.py +++ b/plone/app/discussion/browser/controlpanel.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- - -from Acquisition import aq_base, aq_inner - +from zope.component import getUtility from Products.CMFCore.utils import getToolByName - from Products.CMFCore.interfaces._content import IDiscussionResponse +from Products.CMFPlone.interfaces.controlpanel import IMailSchema from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile @@ -24,6 +22,7 @@ from z3c.form import button from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget from plone.app.discussion.interfaces import IDiscussionSettings, _ +from plone.app.discussion.upgrades import update_registry class DiscussionSettingsEditForm(controlpanel.RegistryEditForm): @@ -51,6 +50,10 @@ class DiscussionSettingsEditForm(controlpanel.RegistryEditForm): SingleCheckBoxFieldWidget self.fields['moderation_enabled'].widgetFactory = \ SingleCheckBoxFieldWidget + self.fields['edit_comment_enabled'].widgetFactory = \ + SingleCheckBoxFieldWidget + self.fields['delete_own_comment_enabled'].widgetFactory = \ + SingleCheckBoxFieldWidget self.fields['anonymous_comments'].widgetFactory = \ SingleCheckBoxFieldWidget self.fields['show_commenter_image'].widgetFactory = \ @@ -61,7 +64,13 @@ class DiscussionSettingsEditForm(controlpanel.RegistryEditForm): SingleCheckBoxFieldWidget def updateWidgets(self): - super(DiscussionSettingsEditForm, self).updateWidgets() + try: + super(DiscussionSettingsEditForm, self).updateWidgets() + except KeyError: + # upgrade profile not visible in prefs_install_products_form + # provide auto-upgrade + update_registry(self.context) + super(DiscussionSettingsEditForm, self).updateWidgets() self.widgets['globally_enabled'].label = _(u"Enable Comments") self.widgets['anonymous_comments'].label = _(u"Anonymous Comments") self.widgets['show_commenter_image'].label = _(u"Commenter Image") @@ -118,6 +127,12 @@ class DiscussionSettingsControlPanel(controlpanel.ControlPanelFormWrapper): elif settings.moderation_enabled: output.append("moderation_enabled") + if settings.edit_comment_enabled: + output.append("edit_comment_enabled") + + if settings.delete_own_comment_enabled: + output.append("delte_own_comment_enabled") + # Anonymous comments if settings.anonymous_comments: output.append("anonymous_comments") @@ -140,12 +155,11 @@ class DiscussionSettingsControlPanel(controlpanel.ControlPanelFormWrapper): def mailhost_warning(self): """Returns true if mailhost is not configured properly. """ - # Copied from plone.app.controlpanel/plone/app/controlpanel/overview.py - mailhost = getToolByName(aq_inner(self.context), 'MailHost', None) - if mailhost is None: - return True - mailhost = getattr(aq_base(mailhost), 'smtp_host', None) - email = getattr(aq_inner(self.context), 'email_from_address', None) + # Copied from Products.CMFPlone/controlpanel/browser/overview.py + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + mailhost = mail_settings.smtp_host + email = mail_settings.email_from_address if mailhost and email: return False return True @@ -165,7 +179,7 @@ class DiscussionSettingsControlPanel(controlpanel.ControlPanelFormWrapper): def unmigrated_comments_warning(self): """Returns true if site contains unmigrated comments. """ - catalog = getToolByName(aq_inner(self.context), 'portal_catalog', None) + catalog = getToolByName(self.context, 'portal_catalog', None) count_comments_old = catalog.searchResults( object_provides=IDiscussionResponse.__identifier__) if count_comments_old: diff --git a/plone/app/discussion/browser/javascripts/comments.js b/plone/app/discussion/browser/javascripts/comments.js index 25accda..927c00d 100644 --- a/plone/app/discussion/browser/javascripts/comments.js +++ b/plone/app/discussion/browser/javascripts/comments.js @@ -35,8 +35,9 @@ */ reply_div.appendTo(comment_div).css("display", "none"); - /* Remove id="reply" attribute, since we use it to uniquely + /* Remove id="commenting" attribute, since we use it to uniquely define the main reply form. */ + // Still belongs to class="reply" reply_div.removeAttr("id"); /* Hide the reply button (only hide, because we may want to show it @@ -47,6 +48,13 @@ /* Fetch the reply form inside the reply div */ var reply_form = reply_div.find("form"); + /* Change the id of the textarea of the reply form + * To avoid conflict later between textareas with same id 'form-widgets-comment-text' while implementing a seperate instance of TinyMCE + * */ + reply_form.find('#formfield-form-widgets-comment-text').attr('id', 'formfield-form-widgets-new-textarea'+comment_id ); + reply_form.find('#form-widgets-comment-text').attr('id', 'form-widgets-new-textarea'+comment_id ); + + /* Populate the hidden 'in_reply_to' field with the correct comment id */ reply_form.find("input[name='form.widgets.in_reply_to']") @@ -98,7 +106,7 @@ var post_comment_div = $("#commenting"); var in_reply_to_field = post_comment_div.find("input[name='form.widgets.in_reply_to']"); - if (in_reply_to_field.val() !== "") { + if (in_reply_to_field.length !== 0 && in_reply_to_field.val() !== "") { var current_reply_id = "#" + in_reply_to_field.val(); var current_reply_to_div = $(".discussion").find(current_reply_id); $.createReplyForm(current_reply_to_div); @@ -143,7 +151,7 @@ /********************************************************************** * Publish a single comment. **********************************************************************/ - $("input[name='form.button.PublishComment']").live('click', function () { + $("input[name='form.button.PublishComment']").on('click', function () { var trigger = this; var form = $(this).parents("form"); var data = $(form).serialize(); @@ -151,7 +159,7 @@ $.ajax({ type: "GET", url: form_url, - data: "workflow_action=publish", + data: data, context: trigger, success: function (msg) { // remove button (trigger object can't be directly removed) @@ -165,11 +173,20 @@ return false; }); + /********************************************************************** + * Edit a comment + **********************************************************************/ + $("form[name='edit']").prepOverlay({ + cssclass: 'overlay-edit-comment', + width: '60%', + subtype: 'ajax', + filter: '#content>*' + }) /********************************************************************** * Delete a comment and its answers. **********************************************************************/ - $("input[name='form.button.DeleteComment']").live('click', function () { + $("input[name='form.button.DeleteComment']").on('click', function () { var trigger = this; var form = $(this).parents("form"); var data = $(form).serialize(); @@ -194,6 +211,9 @@ $(this).remove(); }); }); + // Add delete button to the parent + var parent = comment.prev('[class*="replyTreeLevel' + (treelevel - 1) + '"]'); + parent.find('form[name="delete"]').css('display', 'inline'); // remove comment $(this).fadeOut('fast', function () { $(this).remove(); diff --git a/plone/app/discussion/browser/javascripts/controlpanel.js b/plone/app/discussion/browser/javascripts/controlpanel.js index ba32492..9d242ce 100644 --- a/plone/app/discussion/browser/javascripts/controlpanel.js +++ b/plone/app/discussion/browser/javascripts/controlpanel.js @@ -40,6 +40,8 @@ $.enableSettings([ $('#formfield-form-widgets-anonymous_comments'), $('#formfield-form-widgets-moderation_enabled'), + $('#formfield-form-widgets-edit_comment_enabled'), + $('#formfield-form-widgets-delete_own_comment_enabled'), $('#formfield-form-widgets-text_transform'), $('#formfield-form-widgets-captcha'), $('#formfield-form-widgets-show_commenter_image'), @@ -52,6 +54,8 @@ $.disableSettings([ $('#formfield-form-widgets-anonymous_comments'), $('#formfield-form-widgets-moderation_enabled'), + $('#formfield-form-widgets-edit_comment_enabled'), + $('#formfield-form-widgets-delete_own_comment_enabled'), $('#formfield-form-widgets-text_transform'), $('#formfield-form-widgets-captcha'), $('#formfield-form-widgets-show_commenter_image'), @@ -100,7 +104,7 @@ $.updateSettings(); // Set #content class and update settings afterwards - $("input,select").live("change", function (e) { + $("input,select").on("change", function (e) { var id = $(this).attr("id"); if (id === "form-widgets-globally_enabled-0") { if ($(this).attr("checked")) { diff --git a/plone/app/discussion/browser/moderation.pt b/plone/app/discussion/browser/moderation.pt index dd0a7b1..d5c2065 100644 --- a/plone/app/discussion/browser/moderation.pt +++ b/plone/app/discussion/browser/moderation.pt @@ -25,18 +25,18 @@ Moderate comments -
-
Warning
-
+ Warning + Moderation workflow is disabled. You have to enable the 'Comment Review Workflow' for the Comment content type before you can moderate comments here. -
-
+ +
diff --git a/plone/app/discussion/browser/moderation.py b/plone/app/discussion/browser/moderation.py index aa7bb91..ebdb97a 100644 --- a/plone/app/discussion/browser/moderation.py +++ b/plone/app/discussion/browser/moderation.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- from Acquisition import aq_inner, aq_parent +from AccessControl import getSecurityManager +from zope.component import queryUtility + +from AccessControl import Unauthorized, getSecurityManager from Products.Five.browser import BrowserView from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile @@ -8,8 +12,11 @@ from Products.CMFCore.utils import getToolByName from Products.statusmessages.interfaces import IStatusMessage +from plone.registry.interfaces import IRegistry +from plone.app.discussion.interfaces import IDiscussionSettings from plone.app.discussion.interfaces import _ from plone.app.discussion.interfaces import IComment +from plone.app.discussion.interfaces import IReplies class View(BrowserView): @@ -94,17 +101,57 @@ class DeleteComment(BrowserView): comment = aq_inner(self.context) conversation = aq_parent(comment) content_object = aq_parent(conversation) - del conversation[comment.id] - content_object.reindexObject() - IStatusMessage(self.context.REQUEST).addStatusMessage( - _("Comment deleted."), - type="info") + # conditional security + # base ZCML condition zope2.deleteObject allows 'delete own object' + # modify this for 'delete_own_comment_allowed' controlpanel setting + if self.can_delete(comment): + del conversation[comment.id] + content_object.reindexObject() + IStatusMessage(self.context.REQUEST).addStatusMessage( + _("Comment deleted."), + type="info") came_from = self.context.REQUEST.HTTP_REFERER # if the referrer already has a came_from in it, don't redirect back if len(came_from) == 0 or 'came_from=' in came_from: came_from = content_object.absolute_url() return self.context.REQUEST.RESPONSE.redirect(came_from) + def can_delete(self, reply): + """Returns true if current user has the 'Delete comments' + permission. + """ + return getSecurityManager().checkPermission('Delete comments', + aq_inner(reply)) + + +class DeleteOwnComment(DeleteComment): + """Delete an own comment if it has no replies. Following conditions have to be true + for a user to be able to delete his comments: + * "Delete own comments" permission + * no replies to the comment + * Owner role directly assigned on the comment object + """ + + def could_delete(self, comment=None): + """Returns true if the comment could be deleted if it had no replies.""" + sm = getSecurityManager() + comment = comment or aq_inner(self.context) + userid = sm.getUser().getId() + return (sm.checkPermission('Delete own comments', + comment) + and 'Owner' in comment.get_local_roles_for_userid(userid)) + + def can_delete(self, comment=None): + comment = comment or self.context + return (len(IReplies(aq_inner(comment))) == 0 + and self.could_delete(comment=comment)) + + def __call__(self): + if self.can_delete(): + super(DeleteOwnComment, self).__call__() + else: + raise Unauthorized("You're not allowed to delete this comment.") + class PublishComment(BrowserView): """Publish a comment. @@ -131,11 +178,10 @@ class PublishComment(BrowserView): comment = aq_inner(self.context) content_object = aq_parent(aq_parent(comment)) workflowTool = getToolByName(comment, 'portal_workflow', None) - current_state = workflowTool.getInfoFor(comment, 'review_state') - if current_state != 'published': - workflowTool.doActionFor(comment, 'publish') + workflow_action = self.request.form.get('workflow_action', 'publish') + workflowTool.doActionFor(comment, workflow_action) comment.reindexObject() - content_object.reindexObject() + content_object.reindexObject(idxs=['total_comments']) IStatusMessage(self.context.REQUEST).addStatusMessage( _("Comment approved."), type="info") @@ -208,7 +254,7 @@ class BulkActionsView(BrowserView): if current_state != 'published': workflowTool.doActionFor(comment, 'publish') comment.reindexObject() - content_object.reindexObject() + content_object.reindexObject(idxs=['total_comments']) def mark_as_spam(self): raise NotImplementedError @@ -227,4 +273,4 @@ class BulkActionsView(BrowserView): conversation = aq_parent(comment) content_object = aq_parent(conversation) del conversation[comment.id] - content_object.reindexObject() + content_object.reindexObject(idxs=['total_comments']) diff --git a/plone/app/discussion/browser/stylesheets/discussion.css b/plone/app/discussion/browser/stylesheets/discussion.css index fcbfe3b..641c8a5 100644 --- a/plone/app/discussion/browser/stylesheets/discussion.css +++ b/plone/app/discussion/browser/stylesheets/discussion.css @@ -224,3 +224,9 @@ .row .discussion label { font-weight:bold; } + +/* editing comments */ + +.overlay-edit-comment textarea { + height: 10em; +} diff --git a/plone/app/discussion/comment.py b/plone/app/discussion/comment.py index df81bf7..fb9c30e 100644 --- a/plone/app/discussion/comment.py +++ b/plone/app/discussion/comment.py @@ -9,7 +9,9 @@ from datetime import datetime from smtplib import SMTPException from zope.annotation.interfaces import IAnnotatable +from zope.component import getUtility +from zope.event import notify from zope.component.factory import Factory from zope.component import queryUtility @@ -30,18 +32,25 @@ from Products.CMFPlone.utils import safe_unicode from OFS.Traversable import Traversable -from plone.registry.interfaces import IRegistry +from plone.app.discussion.events import CommentAddedEvent +from plone.app.discussion.events import CommentRemovedEvent +from plone.app.discussion.events import ReplyAddedEvent +from plone.app.discussion.events import ReplyRemovedEvent from plone.app.discussion import PloneAppDiscussionMessageFactory as _ from plone.app.discussion.interfaces import IComment from plone.app.discussion.interfaces import IConversation from plone.app.discussion.interfaces import IDiscussionSettings +from plone.registry.interfaces import IRegistry + from Products.CMFCore.CMFCatalogAware import CatalogAware from Products.CMFCore.CMFCatalogAware import WorkflowAware +from Products.CMFPlone.interfaces.controlpanel import IMailSchema from OFS.role import RoleManager from AccessControl import ClassSecurityInfo +from AccessControl.SecurityManagement import getSecurityManager from Products.CMFCore import permissions @@ -115,6 +124,14 @@ class Comment(CatalogAware, WorkflowAware, DynamicType, Traversable, self.creation_date = self.modification_date = datetime.utcnow() self.mime_type = 'text/plain' + user = getSecurityManager().getUser() + if user and user.getId(): + aclpath = [x for x in user.getPhysicalPath() if x] + self._owner = (aclpath, user.getId(),) + self.__ac_local_roles__ = { + user.getId(): ['Owner'] + } + @property def __name__(self): return self.comment_id and unicode(self.comment_id) or None @@ -186,14 +203,14 @@ class Comment(CatalogAware, WorkflowAware, DynamicType, Traversable, content = aq_base(self.__parent__.__parent__) title = translate( Message(COMMENT_TITLE, - mapping={'author_name': author_name, + mapping={'author_name': safe_unicode(author_name), 'content': safe_unicode(content.Title())})) return title def Creator(self): """The name of the person who wrote the comment. """ - return self.creator + return self.creator or self.author_name security.declareProtected(permissions.View, 'Type') @@ -232,7 +249,6 @@ def notify_content_object(obj, event): 'last_comment_date', 'commentators')) - def notify_content_object_deleted(obj, event): """Remove all comments of a content object when the content object has been deleted. @@ -242,6 +258,23 @@ def notify_content_object_deleted(obj, event): while conversation: del conversation[conversation.keys()[0]] +def notify_comment_added(obj, event): + """ Notify custom discussion events when a comment is added or replied + """ + conversation = aq_parent(obj) + context = aq_parent(conversation) + if getattr(obj, 'in_reply_to', None): + return notify(ReplyAddedEvent(context, obj)) + return notify(CommentAddedEvent(context, obj)) + +def notify_comment_removed(obj, event): + """ Notify custom discussion events when a comment or reply is removed + """ + conversation = aq_parent(obj) + context = aq_parent(conversation) + if getattr(obj, 'in_reply_to', None): + return notify(ReplyRemovedEvent(context, obj)) + return notify(CommentRemovedEvent(context, obj)) def notify_content_object_moved(obj, event): """Update all comments of a content object that has been moved. @@ -298,9 +331,9 @@ def notify_user(obj, event): # Get informations that are necessary to send an email mail_host = getToolByName(obj, 'MailHost') - portal_url = getToolByName(obj, 'portal_url') - portal = portal_url.getPortalObject() - sender = portal.getProperty('email_from_address') + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + sender = mail_settings.email_from_address # Check if a sender address is available if not sender: @@ -372,9 +405,9 @@ def notify_moderator(obj, event): # Get informations that are necessary to send an email mail_host = getToolByName(obj, 'MailHost') - portal_url = getToolByName(obj, 'portal_url') - portal = portal_url.getPortalObject() - sender = portal.getProperty('email_from_address') + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + sender = mail_settings.email_from_address if settings.moderator_email: mto = settings.moderator_email diff --git a/plone/app/discussion/configure.zcml b/plone/app/discussion/configure.zcml index ed82463..8ead976 100644 --- a/plone/app/discussion/configure.zcml +++ b/plone/app/discussion/configure.zcml @@ -14,6 +14,7 @@ + @@ -43,6 +44,27 @@ for="Products.CMFPlone.interfaces.IPloneSiteRoot" /> + + + + + diff --git a/plone/app/discussion/contentrules.py b/plone/app/discussion/contentrules.py new file mode 100644 index 0000000..dfa00fc --- /dev/null +++ b/plone/app/discussion/contentrules.py @@ -0,0 +1,97 @@ +""" Content rules handlers +""" +from plone.app.discussion import PloneAppDiscussionMessageFactory as _ + + +try: + from plone.stringinterp.adapters import BaseSubstitution +except ImportError: + class BaseSubstitution(object): + """ Fallback class if plone.stringinterp is not available + """ + def __init__(self, context, **kwargs): + self.context = context + +try: + from plone.app.contentrules.handlers import execute +except ImportError: + execute = lambda context, event: False + + +def execute_comment(event): + """ Execute comment content rules + """ + execute(event.object, event) + +class CommentSubstitution(BaseSubstitution): + """ Comment string substitution + """ + def __init__(self, context, **kwargs): + super(CommentSubstitution, self).__init__(context, **kwargs) + + @property + def event(self): + """ event that triggered the content rule + """ + return self.context.REQUEST.get('event') + + @property + def comment(self): + """ Get changed inline comment + """ + return self.event.comment + +class Id(CommentSubstitution): + """ Comment id string substitution + """ + category = _(u'Comments') + description = _(u'Comment id') + + def safe_call(self): + """ Safe call + """ + return getattr(self.comment, 'comment_id', u'') + +class Text(CommentSubstitution): + """ Comment text + """ + category = _(u'Comments') + description = _(u'Comment text') + + def safe_call(self): + """ Safe call + """ + return getattr(self.comment, 'text', u'') + +class AuthorUserName(CommentSubstitution): + """ Comment author user name string substitution + """ + category = _(u'Comments') + description = _(u'Comment author user name') + + def safe_call(self): + """ Safe call + """ + return getattr(self.comment, 'author_username', u'') + +class AuthorFullName(CommentSubstitution): + """ Comment author full name string substitution + """ + category = _(u'Comments') + description = _(u'Comment author full name') + + def safe_call(self): + """ Safe call + """ + return getattr(self.comment, 'author_name', u'') + +class AuthorEmail(CommentSubstitution): + """ Comment author email string substitution + """ + category = _(u'Comments') + description = _(u'Comment author email') + + def safe_call(self): + """ Safe call + """ + return getattr(self.comment, 'author_email', u'') diff --git a/plone/app/discussion/contentrules.zcml b/plone/app/discussion/contentrules.zcml new file mode 100644 index 0000000..5dd222a --- /dev/null +++ b/plone/app/discussion/contentrules.zcml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plone/app/discussion/events.py b/plone/app/discussion/events.py new file mode 100644 index 0000000..804077a --- /dev/null +++ b/plone/app/discussion/events.py @@ -0,0 +1,45 @@ +""" Custom discussion events +""" +from zope.interface import implements +from plone.app.discussion.interfaces import IComment +from plone.app.discussion.interfaces import IDiscussionEvent +from plone.app.discussion.interfaces import ICommentAddedEvent +from plone.app.discussion.interfaces import ICommentRemovedEvent +from plone.app.discussion.interfaces import IReplyAddedEvent +from plone.app.discussion.interfaces import IReplyRemovedEvent + +class DiscussionEvent(object): + """ Custom event + """ + implements(IDiscussionEvent) + + def __init__(self, context, comment, **kwargs): + self.object = context + self.comment = comment + for key, value in kwargs.items(): + setattr(self, key, value) + + # Add event to the request to be able to access comment attributes + # in content-rules dynamic strings + request = context.REQUEST + request.set('event', self) + +class CommentAddedEvent(DiscussionEvent): + """ Event to be triggered when a Comment is added + """ + implements(ICommentAddedEvent) + +class CommentRemovedEvent(DiscussionEvent): + """ Event to be triggered when a Comment is removed + """ + implements(ICommentRemovedEvent) + +class ReplyAddedEvent(DiscussionEvent): + """ Event to be triggered when a Comment reply is added + """ + implements(IReplyAddedEvent) + +class ReplyRemovedEvent(DiscussionEvent): + """ Event to be triggered when a Comment reply is removed + """ + implements(IReplyRemovedEvent) diff --git a/plone/app/discussion/i18n/plone-ca.po b/plone/app/discussion/i18n/plone-ca.po index d242b4d..cd8adc1 100644 --- a/plone/app/discussion/i18n/plone-ca.po +++ b/plone/app/discussion/i18n/plone-ca.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: Victor Fernandez de Alba \n" "Language-Team: LANGUAGE \n" diff --git a/plone/app/discussion/i18n/plone-cs.po b/plone/app/discussion/i18n/plone-cs.po index 52a7369..358c58e 100644 --- a/plone/app/discussion/i18n/plone-cs.po +++ b/plone/app/discussion/i18n/plone-cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-11-03 14:51+0100\n" "Last-Translator: Radim Novotny \n" "Language-Team: DMS4U \n" diff --git a/plone/app/discussion/i18n/plone-da.po b/plone/app/discussion/i18n/plone-da.po index f2fb091..2547543 100644 --- a/plone/app/discussion/i18n/plone-da.po +++ b/plone/app/discussion/i18n/plone-da.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-01-28 15:00+0000\n" "Last-Translator: Anton Stonor \n" "Language-Team: Anton Stonor \n" diff --git a/plone/app/discussion/i18n/plone-de.po b/plone/app/discussion/i18n/plone-de.po index ea1d442..28a446a 100644 --- a/plone/app/discussion/i18n/plone-de.po +++ b/plone/app/discussion/i18n/plone-de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-03-17 16:11+0100\n" "Last-Translator: Timo Stollenwerk \n" "Language-Team: Deutsch \n" @@ -16,15 +16,15 @@ msgstr "" #: ../profiles/default/workflows/comment_review_workflow/definition.xml msgid "A simple review workflow for comments" -msgstr "" +msgstr "Ein einfacher redaktioneller Workflow für Kommentare" #: ../profiles/default/workflows/comment_review_workflow/definition.xml msgid "Approve" -msgstr "" +msgstr "Genehmigen" #: ../profiles/default/workflows/comment_review_workflow/definition.xml msgid "Approving the comment makes it visible to other users." -msgstr "" +msgstr "Durch die Genehmigung des Kommentars wird es für andere Benutzer sichtbar." #: ../profiles/default/types/Discussion_Item.xml msgid "Comment" @@ -72,7 +72,7 @@ msgstr "Veröffentlicht" #: ../profiles/default/workflows/comment_review_workflow/definition.xml msgid "Reviewer approves content" -msgstr "" +msgstr "Der Redakteur genehmigt den Inhalt" #: ../profiles/default/workflows/comment_review_workflow/definition.xml msgid "Submitted, pending review." diff --git a/plone/app/discussion/i18n/plone-el.po b/plone/app/discussion/i18n/plone-el.po index 07dc8a2..75218cf 100644 --- a/plone/app/discussion/i18n/plone-el.po +++ b/plone/app/discussion/i18n/plone-el.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-02-23 10:26+0100\n" "Last-Translator: Yiorgis Gozadinos \n" "Language-Team: Greek \n" diff --git a/plone/app/discussion/i18n/plone-es.po b/plone/app/discussion/i18n/plone-es.po index e607191..83918db 100644 --- a/plone/app/discussion/i18n/plone-es.po +++ b/plone/app/discussion/i18n/plone-es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: Mikel Larreategi \n" "Language-Team: Mikel Larreategi \n" diff --git a/plone/app/discussion/i18n/plone-eu.po b/plone/app/discussion/i18n/plone-eu.po index 64f9cf5..f5f59ec 100644 --- a/plone/app/discussion/i18n/plone-eu.po +++ b/plone/app/discussion/i18n/plone-eu.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-01-28 15:00+0000\n" "Last-Translator: Mikel Larreategi \n" "Language-Team: Mikel Larreategi \n" diff --git a/plone/app/discussion/i18n/plone-fr.po b/plone/app/discussion/i18n/plone-fr.po index 37783c2..7bcdc3e 100644 --- a/plone/app/discussion/i18n/plone-fr.po +++ b/plone/app/discussion/i18n/plone-fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-08-06 19:23+0100\n" "Last-Translator: Vincent Fretin \n" "Language-Team: Vincent Fretin \n" diff --git a/plone/app/discussion/i18n/plone-it.po b/plone/app/discussion/i18n/plone-it.po index 497244d..3a73214 100644 --- a/plone/app/discussion/i18n/plone-it.po +++ b/plone/app/discussion/i18n/plone-it.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/plone/app/discussion/i18n/plone-ja.po b/plone/app/discussion/i18n/plone-ja.po index c4a916d..203e0d1 100644 --- a/plone/app/discussion/i18n/plone-ja.po +++ b/plone/app/discussion/i18n/plone-ja.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2011-04-18 13:13+0900\n" "Last-Translator: Takeshi Yamamoto \n" "Language-Team: Hanno Schlichting \n" diff --git a/plone/app/discussion/i18n/plone-nl.po b/plone/app/discussion/i18n/plone-nl.po index a6d7992..8811833 100644 --- a/plone/app/discussion/i18n/plone-nl.po +++ b/plone/app/discussion/i18n/plone-nl.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2011-09-30 16:02+0100\n" "Last-Translator: NFG Net Facilities Group BV \n" "Language-Team: Nederlands \n" diff --git a/plone/app/discussion/i18n/plone-no.po b/plone/app/discussion/i18n/plone-no.po index 3a17d7d..dc914f0 100644 --- a/plone/app/discussion/i18n/plone-no.po +++ b/plone/app/discussion/i18n/plone-no.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/plone/app/discussion/i18n/plone-pt_BR.po b/plone/app/discussion/i18n/plone-pt_BR.po index 5964c1e..ad4906d 100644 --- a/plone/app/discussion/i18n/plone-pt_BR.po +++ b/plone/app/discussion/i18n/plone-pt_BR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2011-04-14 17:38-0300\n" "Last-Translator: Andre Nogueira \n" "Language-Team: Plone i18n \n" diff --git a/plone/app/discussion/i18n/plone-sk.po b/plone/app/discussion/i18n/plone-sk.po index 6de07f9..19dc7ce 100644 --- a/plone/app/discussion/i18n/plone-sk.po +++ b/plone/app/discussion/i18n/plone-sk.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2012-07-02 17:54+0100\n" "Last-Translator: Radim Novotny \n" "Language-Team: Hanno Schlichting \n" diff --git a/plone/app/discussion/i18n/plone-uk.po b/plone/app/discussion/i18n/plone-uk.po index a3754b7..7515c1d 100644 --- a/plone/app/discussion/i18n/plone-uk.po +++ b/plone/app/discussion/i18n/plone-uk.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2013-04-12 14:55+0300\n" "Last-Translator: Roman Kozlovskyi \n" "Language-Team: Hanno Schlichting \n" diff --git a/plone/app/discussion/i18n/plone-zh_CN.po b/plone/app/discussion/i18n/plone-zh_CN.po index 3e6a87d..62e313d 100644 --- a/plone/app/discussion/i18n/plone-zh_CN.po +++ b/plone/app/discussion/i18n/plone-zh_CN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2011-08-19 12:23+0800\n" "Last-Translator: Jian Aijun \n" "Language-Team: plone \n" diff --git a/plone/app/discussion/i18n/plone-zh_TW.po b/plone/app/discussion/i18n/plone-zh_TW.po index 88b303b..efb78ac 100644 --- a/plone/app/discussion/i18n/plone-zh_TW.po +++ b/plone/app/discussion/i18n/plone-zh_TW.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-08-07 23:11+0800\n" "Last-Translator: TsungWei Hu \n" "Language-Team: Taiwan Python User Group \n" diff --git a/plone/app/discussion/i18n/plone.pot b/plone/app/discussion/i18n/plone.pot index 973a956..03eb8b7 100644 --- a/plone/app/discussion/i18n/plone.pot +++ b/plone/app/discussion/i18n/plone.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-01-28 15:00+0000\n" "Last-Translator: Hanno Schlichting \n" "Language-Team: Hanno Schlichting \n" diff --git a/plone/app/discussion/interfaces.py b/plone/app/discussion/interfaces.py index d8a4da8..c0328b3 100644 --- a/plone/app/discussion/interfaces.py +++ b/plone/app/discussion/interfaces.py @@ -4,6 +4,7 @@ from zope.interface import Interface from zope.interface.common.mapping import IIterableMapping +from zope.component.interfaces import IObjectEvent from zope import schema from plone.app.discussion import PloneAppDiscussionMessageFactory as _ @@ -242,6 +243,28 @@ class IDiscussionSettings(Interface): default=False, ) + edit_comment_enabled = schema.Bool( + title=_(u"label_edit_comment_enabled", + default="Enable editing of comments"), + description=_(u"help_edit_comment_enabled", + default=u"If selected, supports editing " + "of comments for users with the 'Edit comments' " + "permission."), + required=False, + default=False, + ) + + delete_own_comment_enabled = schema.Bool( + title=_(u"label_delete_own_comment_enabled", + default="Enable deleting own comments"), + description=_(u"help_delete_own_comment_enabled", + default=u"If selected, supports deleting " + "of own comments for users with the " + "'Delete own comments' permission."), + required=False, + default=False, + ) + text_transform = schema.Choice( title=_(u"label_text_transform", default="Comment text transform"), @@ -293,8 +316,7 @@ class IDiscussionSettings(Interface): u"help_moderator_notification_enabled", default=u"If selected, the moderator is notified if a comment " u"needs attention. The moderator email address can " + - u"be found in the 'Mail settings' control panel " - u"(Site 'From' address)"), + u"be set below."), required=False, default=False, ) @@ -346,3 +368,27 @@ class ICommentingTool(Interface): This can be removed once we no longer support upgrading from versions of Plone that had a portal_discussion tool. """ + +# +# Custom events +# + +class IDiscussionEvent(IObjectEvent): + """ Discussion custom event + """ + +class ICommentAddedEvent(IDiscussionEvent): + """ Comment added + """ + +class ICommentRemovedEvent(IDiscussionEvent): + """ Comment removed + """ + +class IReplyAddedEvent(IDiscussionEvent): + """ Comment reply added + """ + +class IReplyRemovedEvent(IDiscussionEvent): + """ Comment reply removed + """ diff --git a/plone/app/discussion/locales/af/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/af/LC_MESSAGES/plone.app.discussion.po index 29fcd36..989d1bf 100644 --- a/plone/app/discussion/locales/af/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/af/LC_MESSAGES/plone.app.discussion.po @@ -1,5 +1,5 @@ # JC Brand , 2010. -# +# # Some tips for new translators: # ------------------------------ # login: aanmeld, meld aan @@ -7,16 +7,16 @@ # subscribe: inteken, teken in # unsubscribe: uitteken, teken uit # subscribers: intekenaars -# +# # Sommige mense verkies die hoflikheidsvorm "u" bo "jy/jou", en anders om. # Ons probeer dus maar om sover moontlik in die passiewe vorm te skryf. # Bv. # - "Attach your file" -> "Heg die lêer aan" # - "Afterwards you can attach your files" -> "Agterna kan lêers aangeheg -# +# # An updateable list of Afrikaans computer terms can be found here: # https://wiki.ubuntu.com/AfrikaansTranslators/VertalerWoordeboek -# +# msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" @@ -33,11 +33,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "'n Opmerking is geplaas." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "'n ID uniek tot hierdie gesprek" @@ -45,43 +45,67 @@ msgstr "'n ID uniek tot hierdie gesprek" msgid "Add a comment" msgstr "Voeg 'n opmerking by" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonieme kommentaar" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Kanselleer" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Opmerking goedgekeur" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Opmerking verwyder" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Kommentator se Profielfoto" msgid "Commenting infrastructure for Plone" msgstr "Kommentaarinfrastruktuur vir Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Gesprek" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Skeppingsdatum" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -89,43 +113,43 @@ msgstr "" msgid "Disabled" msgstr "Uitgeskakel" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Kommentaar instellings" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-pos" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Laat kommentare toe" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id van dié opmerking waarop hierdie een antwoord" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-tipe" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "E-pos in kennis stelling vir die redaksie" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Wysigingsdatum" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Naam" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Stel my in kennis van nuwe opmerkings m.b.v e-pos" @@ -133,44 +157,44 @@ msgstr "Stel my in kennis van nuwe opmerkings m.b.v e-pos" msgid "Plone Discussions" msgstr "Plone Kommentare" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Portaaltipe" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Lys van kommentators (gebruikersname)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Gebruik e-pos in kennis stelling" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Die opmerking sal geplaas word sodra dit goedgekeur is." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Lewer kommentaar" @@ -184,6 +208,11 @@ msgstr "Skrap" msgid "bulkactions_publish" msgstr "Keur goed" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -204,12 +233,32 @@ msgstr "" msgid "comment_description_plain_text" msgstr "" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} op ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -241,76 +290,81 @@ msgid "heading_moderate_comments" msgstr "Modereer kommentaar" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Indien geselekteer, sal anonieme besoekers opmerkings kan laat sonder om aan te meld. Die captcha-oplossing word aanbeveel indien hierdie opsie aangeskakel word, om gemorspos te voorkom." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Gebruik hierdie instelling om Captcha validasie vir kommentaar aan of af te skakel. Installeer plone.formwidget of plone.formwidget.captcha indien daar geen opsies beskikbaar is nie." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Sommige besprekingsinstellings kom nie op hierdie bladsy voor nie.\n" "Om kommentaar vir 'n spesifieke inhoudstipe aan te skakel, gaan na die Tipes Konfigurasie, kies 'Comment' en stel die werksvloei na \"Comment Review Workflow\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Indien geselekteer, sal gebruikers op die werf kommentare kan plaas. Kommentare moet moontlik ook nog vir sekere inhoudstipe, vouers en objekte aangeskakel word, voordat kommentaar daar gelewer kan word." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 #, fuzzy msgid "help_moderator_notification_enabled" msgstr "Indien geselekteer, sal die moderator in kennis gestel word wanneer 'n opmerking aandag verg." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Indien geselekteer, sal die profielfoto van 'n gebruiker langs sy opmerking vertoon." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Indien geselekteer, sal gebruikers kan kies om per e-pos van nuwe kommentaar in kennis gestel te word." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anoniem" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Skakel anonieme kommentaar aan" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -320,17 +374,17 @@ msgid "label_apply" msgstr "Pas toe" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Opmerking" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "" @@ -339,13 +393,18 @@ msgstr "" msgid "label_delete" msgstr "Skrap" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Laat kommentare globaal toe" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "" @@ -365,12 +424,12 @@ msgid "label_publish" msgstr "Keur goed" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "sê:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Vertoon kommentaarleweraar se foto" @@ -380,28 +439,28 @@ msgid "label_show_full_comment_text" msgstr "Toon die volledige opmerking" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Onderwerp" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Kommentaar tekstransformasie" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Skakel e-pos in kennis stelling aan vir gebruikers" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 #, fuzzy msgid "mail_notification_message" msgstr "'n Opmerking is op '${title}' gelewer: ${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/ca/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/ca/LC_MESSAGES/plone.app.discussion.po index d73e295..328296f 100644 --- a/plone/app/discussion/locales/ca/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/ca/LC_MESSAGES/plone.app.discussion.po @@ -2,23 +2,23 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" -"PO-Revision-Date: 2010-11-17 16:52+0100\n" -"Last-Translator: Victor Fernandez de Alba \n" -"Language-Team: LANGUAGE \n" +"PO-Revision-Date: 2014-12-11 16:07+0100\n" +"Last-Translator: Roberto Diaz \n" +"Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0\n" +"Plural-Forms: nplurals=1; plural=0;\n" "Language-Code: ca\n" "Language-Name: Catalan\n" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Comentari afegit." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Un identificador exclusiu assignat al comentari per aquesta conversa" @@ -26,132 +26,155 @@ msgstr "Un identificador exclusiu assignat al comentari per aquesta conversa" msgid "Add a comment" msgstr "Afegir un comentari" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Comentaris anònims" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Cancel·la" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" -msgstr "" +msgstr "Canvis desats" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Comentari aprovat." -#: ../browser/moderation.py:100 +#: ../contentrules.py:92 +msgid "Comment author email" +msgstr "Correu electrònic de l'autor del comentari" + +#: ../contentrules.py:81 +msgid "Comment author full name" +msgstr "Nom complet de l'autor del comentari" + +#: ../contentrules.py:70 +msgid "Comment author user name" +msgstr "Nom d'usuari de l'autor del comentari " + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Comentari esborrat." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:48 +msgid "Comment id" +msgstr "Identificador del comentari" + +#: ../contentrules.py:59 +msgid "Comment text" +msgstr "Text del comentari" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Imatge de l'autor" msgid "Commenting infrastructure for Plone" msgstr "Infraestructura de comentaris per Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:47 +msgid "Comments" +msgstr "Comentaris" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversa" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Data de creació" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Data de l'últim comentari públic" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Desactivat" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Configuració dels comentaris" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" -msgstr "" +msgstr "Edició cancel·lada" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Correu electrònic" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Permetre comentaris" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Identificador únic del comentari en relació al comentari del qual és resposta" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "Tipus MIME" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificació al moderador per correu electrònic" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Data de modificació" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nom" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Notifica'm de la creació de nous comentaris via correu electrònic." -#: ./plone.app.discussion/plone/app/discussion/configure.zcml +#: plone.app.discussion/plone/app/discussion/configure.zcml msgid "Plone Discussions" msgstr "Plone Discussions" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tipus d'objecte" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" -msgstr "" +msgstr "Desa" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Llistat d'usuaris que han comentat (noms d'usuari)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "El conjunt de comentaristes únics (noms d'usuari) de comentaris publicats" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" -msgstr "" +msgstr "Nombre total de comentaris públics sobre aquest article" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Transformació de '%s' => '%s' no disponible." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notificació a l'usuari via mail" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "Nom d'usuari del comentarista" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "El vostre comentari està pendent d'aprovació per part del moderador de l'espai" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Comenta" @@ -165,32 +188,56 @@ msgstr "Esborra" msgid "bulkactions_publish" msgstr "Publica" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "Cancel·la" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" -msgstr "" +msgstr "Podeu afegir un comentari omplint el següent formulari. Format text pla. Les adreces web y correus electrònics es converteixen a enllaços." #. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." #: ../browser/comments.py:51 msgid "comment_description_markdown" -msgstr "" +msgstr "Podeu afegir un comentari omplint el següent formulari. Format text pla. Podeu utilitzar la sintaxi de Markdown per als enllaços i les imatges." #. Default: "Comments are moderated." #: ../browser/comments.py:63 msgid "comment_description_moderation_enabled" -msgstr "" +msgstr "Comentaris estàn moderats" #. Default: "You can add a comment by filling out the form below. Plain text formatting." #: ../browser/comments.py:46 msgid "comment_description_plain_text" -msgstr "" +msgstr "Podeu afegir un comentari en el següent formulari. Format text pla." + +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "Edició del comentari cancel·lada" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "S'ha editat el comentari" #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" msgstr "${creator} sobre ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "Editar comentari" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "Editar commentari" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -222,76 +269,116 @@ msgid "heading_moderate_comments" msgstr "Moderar comentaris" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" -msgstr "Si està seleccionada, els usuaris anònims podran afegir comentaris sense identificar-se. Es recomana la utilització de una eina de captcha per evitar comentaris spam si aquesta opció està activada." +msgstr "" +"Si està seleccionada, els usuaris anònims podran afegir comentaris sense " +"identificar-se. Es recomana la utilització de una eina de captcha per evitar " +"comentaris spam si aquesta opció està activada." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" +"Si se selecciona, el usuari anònim haurà de donar la seva adreça de correu " +"electrònic." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" -msgstr "Utilitzeu aquesta opció per activar o desactivar una eina de captcha pels comentaris. Instal·leu plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet o collective.z3cform.norobots si no teniu cap opció disponible." +msgstr "" +"Utilitzeu aquesta opció per activar o desactivar una eina de captcha pels " +"comentaris. Instal·leu plone.formwidget.captcha, plone.formwidget.recaptcha, " +"collective.akismet o collective.z3cform.norobots si no teniu cap opció " +"disponible." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" -msgstr "Algunes de les configuracions dels comentaris no estan en la element de configuració 'Comentaris' del panell de control de l'espai. Per activar els comentaris per un tipus de contingut específic, dirigiu-vos al element de configuració 'Tipus' i activeu la opció 'Permetre comentaris'. Per activar el circuit de treball (workflow) de moderació de comentaris, dirigiu-vos al element de configuració de 'Tipus', seleccioneu 'Comentari' i escolliu el 'Workflow de moderació de comentaris'." +msgstr "" +"Algunes de les configuracions dels comentaris no estan en la element de " +"configuració 'Comentaris' del panell de control de l'espai. Per activar els " +"comentaris per un tipus de contingut específic, dirigiu-vos al element de " +"configuració 'Tipus' i activeu la opció 'Permetre comentaris'. Per activar " +"el circuit de treball (workflow) de moderació de comentaris, dirigiu-vos al " +"element de configuració de 'Tipus', seleccioneu 'Comentari' i escolliu el " +"'Workflow de moderació de comentaris'." + +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" +"Si es selecciona, dóna suport a l'edició i eliminació dels comentaris " +"dels usuaris amb el permís 'Edita comentaris'" #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" -msgstr "Si està seleccionada, es permet que els usuaris puguin afegir comentaris a l'espai. De tota manera, teniu que activar els comentaris per a cada tipus de contingut específicament abans de que pogueu afegir comentaris." +msgstr "" +"Si està seleccionada, es permet que els usuaris puguin afegir comentaris a " +"l'espai. De tota manera, teniu que activar els comentaris per a cada tipus " +"de contingut específicament abans de que pogueu afegir comentaris." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" +"Si està seleccionat, els comentaris entraran en un estat \"pendent\" en què " +"són invisibles per al públic. Un usuari amb permís 'Review " +"comments' ('Reviewer' o 'Manager') pot aprovar comentaris perquè siguin " +"visibles per al públic. Si desitja habilitar un comentari personalitzada de " +"flux de treball, vostè ha d'anar al panell de control de tipus." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" -msgstr "" +msgstr "Adreça a la qual s'enviaran les notificacions de moderador." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 -#, fuzzy msgid "help_moderator_notification_enabled" -msgstr "Si està seleccionada, es notificarà per correu electrònic al moderador els nous comentaris." +msgstr "" +"Si està seleccionada, es notificarà per correu electrònic al moderador, dels " +"nous comentaris." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" -msgstr "Si està seleccionada, es mostrarà el retrat (o imatge) que hagi configurat l'usuari en el seu perfil juntament amb el comentari." +msgstr "" +"Si està seleccionada, es mostrarà el retrat (o imatge) que hagi configurat " +"l'usuari en el seu perfil juntament amb el comentari." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" +"Utilitzeu aquesta opció per escollir si el text del comentari ha de " +"transformar-se. Pot escollir entre 'Text sense format' i 'text " +"intel·ligent'. 'Text intel·ligent' converteix el text sense format en HTML " +"on els salts de línia i sangria es conserven, i les adreces web i de correu " +"electrònic es converteixen en enllaços." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" -msgstr "Si està seleccionada, els usuaris poden escollir si volen ser notificats cada cop que s'afegeixi un nou comentari al contingut." +msgstr "" +"Si està seleccionada, els usuaris poden escollir si volen ser notificats " +"cada cop que s'afegeixi un nou comentari al contingut." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 ../comment.py:191 msgid "label_anonymous" msgstr "Anònim" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Permetre comentaris anònims" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "Habilitar correu electrònic anònim" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -299,39 +386,44 @@ msgid "label_apply" msgstr "Aplica" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Comentari" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" -msgstr "" +msgstr "Els comentaris s'han desactivat" #. Default: "Delete" #: ../browser/moderation.pt:130 msgid "label_delete" msgstr "Esborra" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "Activa l'edició de comentaris" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Activa els comentaris de forma global" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" -msgstr "" +msgstr "Habilitar moderació de comentaris" #. Default: "Moderator Email Address" #: ../interfaces.py:314 msgid "label_moderator_email" -msgstr "" +msgstr "Correu electrònic del moderador" #. Default: "Enable moderator email notification" #: ../interfaces.py:302 @@ -344,12 +436,12 @@ msgid "label_publish" msgstr "Aprova" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "diu:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Mostra el retrat (o imatge) de l'autor" @@ -359,40 +451,57 @@ msgid "label_show_full_comment_text" msgstr "Mostra text complet" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Tema" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformacions aplicades al text del comentari" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Activa les notificacions als usuaris" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 -#, fuzzy +#: ../comment.py:59 msgid "mail_notification_message" -msgstr "S'ha publicat un comentari sobre el contingut ${title} en aquesta adreça: ${link}" +msgstr "" +"S'ha publicat un comentari sobre el contingut ${title} en aquesta adreça: " +"${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" +"\"Un comentari sobre '${title}' s'ha publicat aquí: ${link}\n" +"\n" +"---\n" +"${text}\n" +"---\n" +"\n" +"Aprovar comentari:\n" +"${link_approve}\n" +"\n" +"Borrar comentari:\n" +"${link_delete}\n" +"\"" #. Default: "enable the 'Comment Review Workflow' for the Comment content type" #: ../browser/moderation.pt:33 msgid "message_enable_comment_workflow" -msgstr "Activa el 'Workflow de moderació de comentaris' per al tipus de contingut 'Comentari'" +msgstr "" +"Activa el 'Workflow de moderació de comentaris' per al tipus de contingut " +"'Comentari'" #. Default: "Moderation workflow is disabled. You have to ${enable_comment_workflow} before you can moderate comments here." #: ../browser/moderation.pt:33 msgid "message_moderation_disabled" -msgstr "La moderació està desactivada. Teniu que ${enable_comment_workflow} abans de moderar els comentaris." +msgstr "" +"La moderació està desactivada. Teniu que ${enable_comment_workflow} abans de " +"moderar els comentaris." #. Default: "No comments to moderate." #: ../browser/moderation.pt:43 @@ -403,4 +512,3 @@ msgstr "No hi han comentaris per moderar." #: ../browser/moderation.pt:64 msgid "title_bulkactions" msgstr "Accions en bloc" - diff --git a/plone/app/discussion/locales/cs/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/cs/LC_MESSAGES/plone.app.discussion.po index 538c27e..2339a07 100644 --- a/plone/app/discussion/locales/cs/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/cs/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: DOMAIN\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Komentář byl přidán." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Identifikátor komentáře v této konverzaci." @@ -26,43 +26,67 @@ msgstr "Identifikátor komentáře v této konverzaci." msgid "Add a comment" msgstr "Přidat komentář" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonymní komentáře" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Storno" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Změny byly uloženy" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Komentář byl schválen." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Komentář byl odebrán." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Portét komentujícího" msgid "Commenting infrastructure for Plone" msgstr "Komentářový systém pro Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Konverzace" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Datum vytvoření" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -70,43 +94,43 @@ msgstr "" msgid "Disabled" msgstr "Zakázáno" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Nastavení komentářů" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Úpravy byly stornovány" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Email" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Povolit komentáře" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id předchozího komentáře, na který je tento odpovědí" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME typ" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notifikace moderátorů emailem" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Datum změny" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Jméno" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Chci zasílat notifikace o nových komentářích emailem." @@ -114,44 +138,44 @@ msgstr "Chci zasílat notifikace o nových komentářích emailem." msgid "Plone Discussions" msgstr "Komentáře" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Typ položky" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Uložit" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Seznam komentujících" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notifikace emailem" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Váš komentář čeká na schválení." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Přidat komentář" @@ -165,6 +189,11 @@ msgstr "Odebrat" msgid "bulkactions_publish" msgstr "Schválit" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,12 +214,32 @@ msgstr "Komentáře jsou moderovány." msgid "comment_description_plain_text" msgstr "Pokud chcete přidat komentář, zadejte jej do formuláře níže. Nejsou povoleny žádné formátovací značky." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} k ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -222,76 +271,82 @@ msgid "heading_moderate_comments" msgstr "Správa komentářů" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Je-li zaškrtnuto, nepřihlášení uživatelé mohou posílat komentáře. Doporučujeme použití Captcha, pokud povolíte tuto volbu." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Zde můžete povolit nebo zakázat Captcha pro komentáře. Pokud zde není žádná možnost k výběru, nainstalujte prosím balíček plone.formwidget.captcha nebo plone.formwidget.recaptcha, collective.akismet nebo collective.z3cform.norobots." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Nekterá nastavení pro diskuse nejsou k dispozici v ovládacím panelu komentářů.\n" " Povolení komentářů pro konkrétní typ položek se provádí v ovládacím panelu Typy, kde zaškrtnete \"Povolit komentáře\".\n" " Pokud chcete povolit moderování komentářů, přejděte do ovládacích panelů Typy, vyberte typ položky \"Komentář\" a nastavte workflow na \"Schvalovací workflow pro komentáře\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Je-li zaškrtnuto, uživatelé mohou přidávat komentáře. Navíc však musíte ověřit, že je povoleno přidávání komentářů k příslušným typům položek." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Je-li zaškrtnuto, pakbudou komentáře moderované. Po zadání komentáře bude tento komentář ve stavu \"čeká na schválení\" a nebude viditelný nepřihlášeným návštěvníkům. Moderátor (uživatel, ktewrý má opravnění schvalovat komentáře) může takové komentáře schválit a tedy zviditelnit všem." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Adresa, na kterou budou zasílány notifikační emaily moderátorlů" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Je-li zaškrtnuto, moderátor je upozorněn na komentáře, které vyžadují jeho zásah." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Je-li zaškrtnuto, je vedle komentáře zobrazen portrét autora komentáře." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Zde můžete nastavit, zda mají být komentáře nějak upraveny. Je možné vybrat mezi Plain text (prostý, neupravený text) nebo \"Intelligent text\". Intelligent text konvertuje odkazy na aktivní linky a převádí text do HTML tak, jak je vidět na obrazovce (tedy se zachováním nových řádků a odsazení)." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Je-li zaškrtnuto, uživatelé se mohou rozhodnout zda si přejí být upozorněni na nové komentáře emailem." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonym" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Povolit anonymní komentáře" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -301,17 +356,17 @@ msgid "label_apply" msgstr "Provést" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Komentář" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Komentáře byly zakázány." @@ -320,13 +375,18 @@ msgstr "Komentáře byly zakázány." msgid "label_delete" msgstr "Odebrat" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Globální povolení komentářů" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Povolit moderování komentářů" @@ -346,12 +406,12 @@ msgid "label_publish" msgstr "Schválit" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "píše:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Zobrazit portrét komentujícího" @@ -361,22 +421,22 @@ msgid "label_show_full_comment_text" msgstr "zobrazit celý text příspěvku" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Předmět" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformace textu" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Povolit notifikaci uživatelů emailem" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Na adrese ${link} byl přidán komentář k položce '${title}'}\n" @@ -386,7 +446,7 @@ msgstr "" "---" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Na adrese ${link} byl vložen komentář k položce '${title}'\n" diff --git a/plone/app/discussion/locales/da/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/da/LC_MESSAGES/plone.app.discussion.po index ec13feb..8035c72 100644 --- a/plone/app/discussion/locales/da/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/da/LC_MESSAGES/plone.app.discussion.po @@ -14,144 +14,168 @@ msgstr "" "Preferred-Encodings: utf-8\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." -msgstr "En kommentar er gem." +msgstr "Der er oprettet en kommentar." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" -msgstr "En kommentar-id som er unik for denne dialog" +msgstr "Et kommentar-id som er unikt for denne dialog" #: ../browser/comments.py:72 msgid "Add a comment" msgstr "Tilføj en kommentar" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonyme kommentarer" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Afbryd" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Ændringer gemt" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Kommentar godkendt." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Kommentar slettet." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Kommentar-billede" msgid "Commenting infrastructure for Plone" msgstr "Kommentar-funktionalitet til Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Dialog" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Oprettelses-dato" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Dato for den seneste, offentlige kommentar" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Slået fra" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Indstilling for kommentarer" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Redigering blev afbrudt" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" -msgstr "Email" +msgstr "E-mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Slå kommentarer til" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" -msgstr "Id'en på den kommentar, denne kommentar er et svar til" +msgstr "Id'et på den kommentar, denne kommentar er et svar til" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificering af moderator" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Ændringsdato" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Navn" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." -msgstr "Send besked om nye kommentarer pr. email." +msgstr "Send besked om nye kommentarer per e-mail." #: ./plone.app.discussion/plone/app/discussion/configure.zcml msgid "Plone Discussions" msgstr "Plone diskussioner" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" -msgstr "Portal type" +msgstr "Portaltype" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Gem" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Liste over kommentatorer (brugernavne)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "Gruppen af unikke kommentatorer (brugernavne) fra published_comments" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" +msgstr "Det samlede antal offentlige kommentarer til dette element" + +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" - -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" -msgstr "Email-notificering af brugere" +msgstr "E-mail-notificering af brugere" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "Kommentatorens brugernavn" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." -msgstr "Din kommentar venter på godkendelse." +msgstr "Din kommentar venter på godkendelse." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Gem" @@ -165,10 +189,15 @@ msgstr "Slet" msgid "bulkactions_publish" msgstr "Godkend" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" -msgstr "Du kan tilføje en kommentar ved at udfylde formularen nedenfor. Ren tekst-formattering. Web- og emailadresser bliver automatisk lavet om til klikbare links." +msgstr "Du kan tilføje en kommentar ved at udfylde formularen nedenfor. Ren tekst-formattering. Web- og e-mailadresser bliver automatisk lavet om til klikbare links." #. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." #: ../browser/comments.py:51 @@ -185,12 +214,32 @@ msgstr "Kommentarer er modereret." msgid "comment_description_plain_text" msgstr "Du kan tilføje en kommentar ved at udfylde formularen nedenfor. Ren tekst-formattering." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} på ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -222,73 +271,79 @@ msgid "heading_moderate_comments" msgstr "Moderer kommentarer" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Hvis du krydser af, kan anonyme brugere skrive kommentarer uden at være logget ind. I så fald er det en god ide at bruge CAPTCHA for at forhindre spam." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Her kan du slå CAPTCHA til og fra for kommentarer. Installer plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet eller collective.z3cform.norobots, hvis der ikke er nogen valgmuligheder nedenfor." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "Du kan justere kommentarindstillingerne nedenfor. Bemærk, at der også er indstillinger andre steder, som påvirker kommentarer. For at slå kommentarer til for en bestemt indholdstype, så klik \"Typer\" på Kontrolpanelet og afkryds \"Tillad kommentarer\" for typen. For at slå modereringsworkflow til kommentarer, så vælg \"Kommentar\" under \"Typer\" på Kontrolpanelet og vælg workflowet \"Godkendelses-workflow for kommentarer\"" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Hvis du krydser af, kan brugere skrive kommentarer på sitet. Du skal dog først slå kommentering til for bestemte indholdstyper, mapper eller indholdsobjekter, før det virker." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Hvis du krydser af, vil kommentarer automatisk bliver sat i en \"Afventer\"-tilstand, hvor de er usynlige for offentligheden. En bruger med rettigheder til at moderere kommentarer kan godkende kommentarer og gøre dem synlige for offentligheden." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Adresse på den person, som skal modtage moderator-notificeringer." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Hvis du krydser af, får en moderator besked, hvis en kommentarer skal vurderes." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Hvis du krydser af, bliver der vist et billede af brugeren ved siden af kommentaren." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Vælg, hvordan kommentartekster skal vises. Du kan vælge mellem \"Plan text\", \"Markdown\" og \"Intelligent text\". Plain text gør ingenting. Markdown fortolker teksten efter Markdown-standarden. Intelligent text oversætter teksten til HTML og bibeholder indrykninger, linjeskift og oversætter emails og webadresser til klikbare links." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Hvis den er slået til, kan brugere få besked om nye kommentarer over email." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonym" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Slå anonym kommentering til" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -298,17 +353,17 @@ msgid "label_apply" msgstr "Udfør" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "CAPTCHA" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Kommentar" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Kommentering er slået fra." @@ -317,13 +372,18 @@ msgstr "Kommentering er slået fra." msgid "label_delete" msgstr "Slet" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Tænd for kommentarer" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Slå kommentarmoderering til" @@ -343,12 +403,12 @@ msgid "label_publish" msgstr "Godkend" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "siger:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Vis kommentator-billede" @@ -358,28 +418,28 @@ msgid "label_show_full_comment_text" msgstr "Hvis fuld kommentar" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Emne" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Formattering af kommentar-tekst" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Slå bruger-notificering til" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 #, fuzzy msgid "mail_notification_message" msgstr "En kommentarer om '${title}' er blevet gemt her: ${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "En kommentar til '${title}' er blevet indsendt her: ${link}\n" diff --git a/plone/app/discussion/locales/de/LC_MESSAGES/.gitignore b/plone/app/discussion/locales/de/LC_MESSAGES/.gitignore deleted file mode 100644 index d8b1cbd..0000000 --- a/plone/app/discussion/locales/de/LC_MESSAGES/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/plone.app.discussion.mo diff --git a/plone/app/discussion/locales/de/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/de/LC_MESSAGES/plone.app.discussion.po index 170e99f..37a228f 100644 --- a/plone/app/discussion/locales/de/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/de/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Ein Kommentar wurde abgegeben." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Eine eindeutige ID des Kommentars" @@ -26,132 +26,156 @@ msgstr "Eine eindeutige ID des Kommentars" msgid "Add a comment" msgstr "Kommentar hinzufügen" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonyme Kommentare" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Abbrechen" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Änderungen gespeichert" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Kommentar zur Veröffentlichung freigegeben." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Kommentar gelöscht" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Porträt des Benutzers" msgid "Commenting infrastructure for Plone" msgstr "" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Diskussion" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Erstellungsdatum" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Datum des neuesten öffentlichen Kommentars" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Ausgeschaltet" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Kommentierungseinstellungen" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Bearbeitung abgebrochen" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-Mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Kommentare einschalten" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "ID des Kommentars, auf den geantwortet wird." -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-Typ" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Moderator E-Mail Benachrichtigung" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Änderungsdatum" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Name" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "E-Mail-Benachrichtigung bei neuen Kommentaren" #: ./plone.app.discussion/plone/app/discussion/configure.zcml msgid "Plone Discussions" -msgstr "Plone Diskussionen" +msgstr "" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Artikeltyp" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Speichern" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Liste von Benutzern, die Kommentare abgegeben haben" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "Summe der veröffentlichten Kommentare zu diesem Artikel" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Transformation '%s' => '%s' ist nicht verfügbar." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "E-Mail-Benachrichtigungen für Benutzer" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "Benutzername des Kommentierenden" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Ihr Kommentar muss noch vom Moderator freigegeben werden." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Kommentieren" @@ -165,6 +189,11 @@ msgstr "Löschen" msgid "bulkactions_publish" msgstr "Veröffentlichen" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,11 +214,31 @@ msgstr "Kommentare werden moderiert." msgid "comment_description_plain_text" msgstr "Sie können einen Kommentar abgeben, indem Sie das untenstehende Formular ausfüllen. Nur Text." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "${author_name} zu ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -221,23 +270,23 @@ msgid "heading_moderate_comments" msgstr "Kommentare moderieren" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Wenn Sie diese Einstellung aktivieren, können anonyme Benutzer Kommentare abgeben. Es ist empfehlenswert, dann auch Captchas zu aktivieren." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "Wenn Sie diese Einstellung aktivieren, müssen anonyme Benutzer ihre E-Mail-Adresse angeben." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 #, fuzzy msgid "help_captcha" msgstr "Wenn Sie diese Einstellung aktivieren, wird mit Hilfe der Captcha-Validierung überprüft, ob die Kommentare von einem echten Benutzer oder von einem automatisierten Skript stammen. Falls Sie die Option nicht einschalten können, fehlt evtl. ein benötigtes Programmmodul. Stellen Sie sicher, dass entweder plone.formwidget.captcha oder plone.formwidget.recaptcha installiert ist." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 #, fuzzy msgid "help_discussion_settings_editform" msgstr "" @@ -245,57 +294,63 @@ msgstr "" "\n" "Um die Moderation von Kommentaren zu aktivieren, wählen Sie den Artikeltyp 'Kommentar' aus und wählen Sie als neuen Arbeitsablauf 'Arbeitsablauf für moderierte Kommentare'." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 #, fuzzy msgid "help_globally_enabled" msgstr "Wenn Sie diese Einstellung aktivieren, können Artikel generell kommentiert werden." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" -msgstr "" +msgstr "Falls ausgewählt werden Kommentare in einem für die Öffentlichkeit unsichtbaren Schwebezustand gehalten, bis sie ein Benutzer mit der 'Review comments' Berechtigung ('Reviewer' or 'Manager') genehmigt und damit für die Öffentlichkeit sichtbar macht. Wenn Sie einen angepassten Arbeitsablauf für Kommentare einstellen wollen, so geht das mit dem Menu unter Artikeltypen." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "E-Mail Adresse an welche die Moderatoren-Benachrichtigungen gesendet werden." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" -msgstr "" +msgstr "Falls ausgewählt erhält der Moderator eine E-Mail, wenn ein Kommentar Aufmerksamkeit braucht. Die E-Mail-Adresse des Moderators kann weiter unten angegeben werden." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Wenn Sie diese Einstellung aktivieren, wird das Porträt des kommentierenden Benutzers neben dem Kommentar angezeigt." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" -msgstr "" +msgstr "Diese Einstellung wählen, wenn eine Transformation in irgend einer Art und Weise gewünscht ist. Sie können zwischen 'Plain text' und 'Intelligent text' wählen. 'Intelligent text' wandelt Plain Text in HTML um, dabei werden Zeilenumbrüche und Einrückungen beibehalten sowie Weblinks und E-Mail-Adressen in klickbare Links verwandelt." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Wenn Sie diese Einstellung auswählen, können Benutzer angeben, dass sie über neue Kommentare per E-Mail informiert werden möchten." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonymer Benutzer" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Anonyme Kommentare" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "E-Mail Feld für anonyme Kommentare einschalten" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -303,39 +358,44 @@ msgid "label_apply" msgstr "Anwenden" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Kommentar" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" -msgstr "" +msgstr "Kommentare wurden abgeschaltet." #. Default: "Delete" #: ../browser/moderation.pt:130 msgid "label_delete" msgstr "Löschen" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Kommentierungsfunktion generell einschalten" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" -msgstr "" +msgstr "Moderation für Kommentare einschalten" #. Default: "Moderator Email Address" #: ../interfaces.py:314 msgid "label_moderator_email" -msgstr "" +msgstr "E-Mail Adresse des Moderators" #. Default: "Enable moderator email notification" #: ../interfaces.py:302 @@ -348,12 +408,12 @@ msgid "label_publish" msgstr "Veröffentlichen" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "sagt" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Zeige das Portrait des Kommentators" @@ -363,22 +423,22 @@ msgid "label_show_full_comment_text" msgstr "Den vollständigen Kommentar anzeigen" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Betreff" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Text transformationen" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "E-Mail-Benachrichtigungen für Benutzer aktivieren" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Ein Kommentar zu '${title}' wurde hier abgegeben: ${link}\n" @@ -388,7 +448,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Ein Kommentar zu '${title}' wurde hier abgegeben: ${link}\n" diff --git a/plone/app/discussion/locales/es/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/es/LC_MESSAGES/plone.app.discussion.po index 8d97d19..a9f8497 100644 --- a/plone/app/discussion/locales/es/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/es/LC_MESSAGES/plone.app.discussion.po @@ -3,9 +3,9 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" -"PO-Revision-Date: 2011-12-14 15:33-0600\n" -"Last-Translator: Héctor Velarde \n" -"Language-Team: es \n" +"PO-Revision-Date: 2014-12-11 16:07+0100\n" +"Last-Translator: Roberto Diaz \n" +"Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -16,11 +16,11 @@ msgstr "" "Domain: plone.app.discussion\n" "X-Is-Fallback-For: es-ar es-bo es-cl es-co es-cr es-do es-ec es-es es-sv es-gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Comentario añadido." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Un comentario de ID exclusivo para esta conversación" @@ -28,87 +28,111 @@ msgstr "Un comentario de ID exclusivo para esta conversación" msgid "Add a comment" msgstr "Añadir un comentario" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Comentarios anónimos" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Cancelar" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Cambios guardados" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Comentario aprobado." -#: ../browser/moderation.py:100 +#: ../contentrules.py:92 +msgid "Comment author email" +msgstr "Correo electrónico del autor del comentario" + +#: ../contentrules.py:81 +msgid "Comment author full name" +msgstr "Nombre completo del autor del comentario" + +#: ../contentrules.py:70 +msgid "Comment author user name" +msgstr "Nombre de usuario del autor del comentario" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Comentario eliminado." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:48 +msgid "Comment id" +msgstr "ID del comentario" + +#: ../contentrules.py:59 +msgid "Comment text" +msgstr "Texto del comentario" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Imagen del autor" msgid "Commenting infrastructure for Plone" msgstr "Infraestructura de comentarios para Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:47 +msgid "Comments" +msgstr "Comentarios" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversación" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Fecha de creación" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Fecha del comentario publico más reciente" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Desactivado" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Ajustes de discusión" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Edición cancelada" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Correo electrónico" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Permitir comentarios" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "ID del comentario este comentario es en respuesta a" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "Tipo MIME" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificación al moderador por correo electrónico" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Fecha de modificación" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nombre" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Recibir avisos por correo cuando haya nuevos comentarios." @@ -116,44 +140,44 @@ msgstr "Recibir avisos por correo cuando haya nuevos comentarios." msgid "Plone Discussions" msgstr "Plone Discussions" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tipo de objeto" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Guardar" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Listado de usuarios que han comentado (nombres de usuario)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "El conjunto de comentaristas únicos (nombres de usuario) de published_comments" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" -msgstr "" +msgstr "Total de comentarios públicos en este artículo" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Transformada '%s' => '%s' no disponible." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notificaciones de correo para usuarios" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "Nombre de usuario del comentarista" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Su comentario está pendiente de aprobación por el moderador." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Comentar" @@ -167,6 +191,11 @@ msgstr "Borrar" msgid "bulkactions_publish" msgstr "Aprobar" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "Cancelar" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -175,7 +204,7 @@ msgstr "Puede agregar un comentario llenando el siguiente formulario. Formato de #. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." #: ../browser/comments.py:51 msgid "comment_description_markdown" -msgstr "" +msgstr "Puede añadir un comentario rellenando el siguiente formulario. Formato texto plano. Puede utilizar la sintaxis de Markdown de enlaces e imágenes." #. Default: "Comments are moderated." #: ../browser/comments.py:63 @@ -185,13 +214,32 @@ msgstr "Los comentarios son moderados." #. Default: "You can add a comment by filling out the form below. Plain text formatting." #: ../browser/comments.py:46 msgid "comment_description_plain_text" -msgstr "Puede agregar un comentario llenando el sigueinte formulario. Formato de texto plano." +msgstr "Puede agregar un comentario llenando el siguiente formulario. Formato de texto plano." + +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "Se ha cancelado la edición del comentario" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "Se ha editado el comentario" #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" -msgstr "${creator} sobre ${content}" +msgstr "${author_name} sobre ${content}" + +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "Editar comentario" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "Editar comentario" #. Default: "Action" #: ../browser/moderation.pt:85 @@ -224,78 +272,85 @@ msgid "heading_moderate_comments" msgstr "Moderar comentarios" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Si está seleccionado, los usuarios anónimos podrán añadir comentarios sin tener que iniciar una sesión. Recomendamos encarecidamente que utilice una solución Captcha para evitar el spam si esta opción está activada." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" -msgstr "" +msgstr "Si se selecciona, el usuario anónimo tendrá que proporcionar su correo electrónico." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Utilice esta opción para activar o desactivar Captcha para los comentarios. Instale plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet o collective.z3cform.norobots si no tiene ninguna opción disponible." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Algunos de los ajustes sobre los comentarios no están en el Panel de Control de Discusiones.\n" "Para activar comentarios para un tipo de objeto específico, vaya al Panel de Control de Tipos y elija 'Activar Comentarios'.\n" "Para activar el workflow de moderación de comentarios, vaya al Panel de Control de Tipos, elija 'Comentario' y elija el 'Workflow de Moderación de Comentarios'." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" +"Si se selecciona, permite la edición y eliminación de comentarios " +"a los usuarios con el permiso 'Edita comentarios'" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Si está seleccionado, se permite que los visitantes hagan comentarios en la web. Sin embargo, tiene que activar los comentarios para cada tipo de objeto específicamente antes de que se puedan añadir los comentarios." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Si está seleccionado, los comentarios entraran en un estado 'Pendiente' en el cual ellos no son visibles para el público. Un usuario con el permiso 'Revisar comentarios' ('Revisor' o 'Administrador') puede aprobar los comentarios y hacerlos visibles al público. Si desea habilitar un workflow de comentarios diferente, puede hacerlo a través de la opción 'Configuración de Tipos' en el panel de control." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "La dirección de correo electrónico a la cual se enviarán las notificaciones de moderación." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" msgstr "Si está seleccionado, se notifica al moderador cuando un nuevo comentario requiere de su atención. La dirección de correo electrónico del moderador se puede encontrar en la opción 'Configuración de correo' del panel de control (Dirección del remitente del sitio)" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Si está seleccionado, se mostrará una imagen del autor junto al comentario." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Elija si el texto de los comentario será transformado de algún modo. Puede seleccionar entre 'Texto plano' y 'Texto inteligente'. 'Texto inteligente' convierte el texto plano en HTML, conservando los cambios de línea y la indentación, y transformando las direcciones web y de correo electrónico en vínculos." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Si está seleccionado, los usuarios pueden solicitar recibir avisos por correo cuando haya nuevos comentarios." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anónimo" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Permitir comentarios anónimos" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "Habilitar campo email de anónimos" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -303,17 +358,17 @@ msgid "label_apply" msgstr "Aplicar" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Comentario" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Los comentarios han sido inhabilitados." @@ -322,13 +377,18 @@ msgstr "Los comentarios han sido inhabilitados." msgid "label_delete" msgstr "Borrar" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "Activar la edición de comentarios" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Activar comentarios de forma global" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Habilitar la moderación de comentarios" @@ -348,12 +408,12 @@ msgid "label_publish" msgstr "Aprobar" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "dice:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Mostrar imagen del autor" @@ -363,22 +423,22 @@ msgid "label_show_full_comment_text" msgstr "Mostrar texto completo" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Tema" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformaciones aplicadas al texto del comentario" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Activar notificación de correo a los usuarios" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Se ha agregado un comentario a ${title} aquí: ${link}\n" @@ -388,7 +448,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Se ha agregado un comentario a '${title}' aquí: ${link}\n" @@ -421,5 +481,4 @@ msgstr "No hay nada para moderar." #. Default: "Bulk Actions" #: ../browser/moderation.pt:64 msgid "title_bulkactions" -msgstr "Acciones conjuntas" - +msgstr "Acciones conjuntas" \ No newline at end of file diff --git a/plone/app/discussion/locales/eu/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/eu/LC_MESSAGES/plone.app.discussion.po index df9ac4a..bad2b9c 100644 --- a/plone/app/discussion/locales/eu/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/eu/LC_MESSAGES/plone.app.discussion.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" -"PO-Revision-Date: 2012-02-08 09:14+0100\n" +"PO-Revision-Date: 2013-11-14 09:09+0100\n" "Last-Translator: Mikel Larreategi \n" "Language-Team: eu \n" "MIME-Version: 1.0\n" @@ -15,11 +15,11 @@ msgstr "" "Domain: DOMAIN\n" "X-Poedit-Language: Basque\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Erantzun bat argitaratu da." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Eztabaida honetarako bakarra den erantzunaren id-a." @@ -27,87 +27,111 @@ msgstr "Eztabaida honetarako bakarra den erantzunaren id-a." msgid "Add a comment" msgstr "Erantzuna gehitu" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Erantzun anonimoak" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Utzi" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Aldaketak gordeta" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Erantzuna onartuta." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Erantzuna ezabatuta." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Erantzuna eman duenaren irudia." msgid "Commenting infrastructure for Plone" msgstr "Ploneren Erantzunen Azpiegitura" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Eztabaida" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Sorrera data" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Azken erantzunaren data" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Desaktibatuta" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Eztabaidaren ezarpenak" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Edizioa utzita" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-posta" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Erantzunak aktibatu" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Erantzun honek erreferentzia egiten dion erantzunaren id-a" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME mota" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Moderatzailea e-postaz abisatu" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Aldaketa data" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Izena" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Erantzun berriak e-postaz bidali" @@ -115,44 +139,44 @@ msgstr "Erantzun berriak e-postaz bidali" msgid "Plone Discussions" msgstr "Plone Eztabaidak" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Elementu mota" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Gorde" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Erantzunak eman dituzten erabiltzaileak (erabiltzaile-izenak)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "Erantzun-emaleen erabiltzaile izenak" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" -msgstr "" +msgstr "Elementu honen erantzun publiko kopurua" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "'%s' => '%s' eraldaketa ez dago erabilgarri." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "E-posta abisuak" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "Erantzuna utzi duenaren erabiltzaile-izena" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Zure erantzuna moderazio kolan dago." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Eman erantzuna" @@ -166,6 +190,11 @@ msgstr "Ezabatu" msgid "bulkactions_publish" msgstr "Onartu" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -186,11 +215,30 @@ msgstr "Erantzunak moderatuta daude." msgid "comment_description_plain_text" msgstr "Erantzuna formulario hau betez utzi dezakezu. Formatua testu arruntarena da." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" -msgstr "${creator} ${content} buruz" +msgstr "${content} - ${creator}" + +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" #. Default: "Action" #: ../browser/moderation.pt:85 @@ -223,78 +271,84 @@ msgid "heading_moderate_comments" msgstr "Erantzunak moderatu" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Aukeratuta badago, erabiltzaile anonimoek erantzunak gehitu ditzakete login egin gabe. Berariaz gomendatzen dizugu Captcha kontrolen bat aktibatzea anonimoen erantzunak baimentzen badituzu." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" -msgstr "" +msgstr "Aukeratuta badago, erabiltzaile anonimoek eposta helbidea idatzi beharko dute" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Erabili aukera hau Captcha aktibatu edo desaktibatzeko. Instalatu plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet edo collective.z3cform.norobots aukerarik ez baldin badago." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Erantzunei dagozkien ezarpen batzuk ez daude Eztabaiden Kontrol Panelean.\n" "Elementu-mota jakin bati erantzunak aktibatzeko, joan elementu-moten kontrol panelera, aukeratu elementua eta aktibatu 'Erantzunak Baimendu'.\n" "Erantzunen Moderazio Workflowa aktibatzeko, joan elementu-moten kontrol panelera, aukeratu 'Erantzuna' eta ezarri 'Erantzunen Moderazio Workflowa'." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Aukeratuta badago, atarian erantzunak gehitu daitezke. Edonola ere, elementu-mota bakoitzarentzat erantzunak baimendu beharko dituzu erabiltzaileak erantzunak ematen hasi aurretik." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Aukeratuta badago, erantzuna 'Zain' izeneko egoeran geldituko da eta ez da argitaratuko. 'Erantzunak errebisatu' baimena duten erabiltzaileek ('Zuzentzailea' edo 'Kudeatzailea') argitaratu ditzakete albisteak. Erantzunen worfklowa pertsonalizatu nahi baduzu, elementu-moten kontrol panelera joan zaitez." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Moderatzailearen notifikazioak bidali behar diren helbidea." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Aukeratuta badago, moderatzaileari e-posta abisua helduko zaio erantzun bat gehitzean. Moderatzailearen e-posta atariaren E-postaren konfigurazioan dago (Atariaren 'Nork' helbidea)" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Aukeratuta badago, erantzuna eman duenaren irudi bat agertuko da testuaren ondoan." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Erabili aukera hau erantzunaren testua nolabait eraldatu behar bada. 'Testu arrunta' edo 'Testu argia'ren artean aukeratu dezakezu. 'Testu argia'-k testu arrunta HTML bihurtzen du lerro saltoak eta espazioak mantenduz, eta web helbideak eta e-postak klikagarri eginez." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Aukeratuta badago, erabiltzaileek euren erantzunen erantzunak e-postaz jasotzea aktibatu dezakete." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonimoak" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Aktibatu erabiltzaile anonimoen erantzunak" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "Aktibatu anonimoentzat eposta eremua" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -302,17 +356,17 @@ msgid "label_apply" msgstr "Aplikatu" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Erantzuna" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Ezin da erantzunik gehitu." @@ -321,13 +375,18 @@ msgstr "Ezin da erantzunik gehitu." msgid "label_delete" msgstr "Ezabatu" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Erantzunak globalki aktibatu" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Erantzunen moderazioa aktibatu." @@ -347,12 +406,12 @@ msgid "label_publish" msgstr "Argitaratu" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "dio:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Erantzuna eman duenaren irudia erakutsi" @@ -362,22 +421,22 @@ msgid "label_show_full_comment_text" msgstr "Erakutsi testu osoa" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Gaia" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Erantzunari aplikatu beharreko transformazioa" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Aktibatu erabiltzaileek e-postaz jakinaraztea" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Erantzuna berria:Izenburua: ${title} \n" @@ -387,7 +446,7 @@ msgstr "" "--" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Erantzun berria:\n" diff --git a/plone/app/discussion/locales/fi/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/fi/LC_MESSAGES/plone.app.discussion.po index 682e50e..07e5c6c 100644 --- a/plone/app/discussion/locales/fi/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/fi/LC_MESSAGES/plone.app.discussion.po @@ -16,11 +16,11 @@ msgstr "" "X-Poedit-Language: Finnish\n" "X-Poedit-Country: FINLAND\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Tämän keskustelun sisällä uniikki tunniste" @@ -28,43 +28,67 @@ msgstr "Tämän keskustelun sisällä uniikki tunniste" msgid "Add a comment" msgstr "Lisää viesti" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Viestit tunnistamattomilta käyttäjiltä" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Peru" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Viesti hyväksytty." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Viesti poistettu." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Kirjoittajan kuva" msgid "Commenting infrastructure for Plone" msgstr "Plone:n kommentointi- ja keskustelutoiminnot" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Keskustelu" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Luotu" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -72,43 +96,43 @@ msgstr "" msgid "Disabled" msgstr "Ei käytössä" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Kommentointi- ja keskustelutoimintojen asetukset" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Sähköposti" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Salli Kommentointi & Keskustelut" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Sen viestin tunniste johon tämä viesti vastaa" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-tyyppi" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Ilmoitukset sähköpostitse tarkistajille" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Muutettu" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nimi" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "" @@ -116,44 +140,44 @@ msgstr "" msgid "Plone Discussions" msgstr "Kommentointi & Keskustelut (Plone Discussions)" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Sisältötyyppi" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Kirjoittajat (käyttäjätunnukset)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Viestisi on vastaanotettu. Se tulee näkyviin heti kun ylläpito on hyväksynyt sen julkaistavaksi." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Lisää" @@ -167,6 +191,11 @@ msgstr "Poista valitut" msgid "bulkactions_publish" msgstr "Hyväksy valitut" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -187,11 +216,31 @@ msgstr "" msgid "comment_description_plain_text" msgstr "" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -223,76 +272,81 @@ msgid "heading_moderate_comments" msgstr "Viestien esitarkistus" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Jos viestit tunnistamattomilta käyttäjiltä sallitaan, on erittäin suositeltavaa käyttää automaattisten roskapostittimien estintä (engl. captcha)." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 #, fuzzy msgid "help_captcha" msgstr "Roskaviestiautomaattien estimen (engl. captcha) käyttö. Jos mitään estintä ei ole valittavissa, järjestelmään ei ole asennettu mitään estintä. Soveltuvia estimiä ovat plone.formwidget.captcha ('Captcha') ja plone.formwidget.recaptcha ('ReCapthca')." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "Tarkista myös keskusteluun / kommentointiin liittyvät asetukset sisältötyyppien hallintapaneelissa ('Sisältötyypit')." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 #, fuzzy msgid "help_globally_enabled" msgstr "Huomaa, että keskustelu/kommentointi pitää myös lisäksi erikseen asettaa päälle halutuille sisältötyypeille ja/tai yksittäisille sisällöille." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 #, fuzzy msgid "help_moderator_notification_enabled" msgstr "Tarkistajana toimivalle ylläpitäjälle ilmoitetaan toimenpiteitä edellyttävistä viesteistä." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Näytetäänkö kirjoittajan kuva viestin yhteydessä." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Salli viestit tunnistamattomilta käyttäjiltä" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -302,17 +356,17 @@ msgid "label_apply" msgstr "toteuta" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Roskaviestien estin" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Viesti" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "" @@ -321,13 +375,18 @@ msgstr "" msgid "label_delete" msgstr "Poista" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Keskustelu/kommentointitoiminnot käytössä" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "" @@ -347,12 +406,12 @@ msgid "label_publish" msgstr "Hyväksy" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Näytä kirjoittajan kuva" @@ -362,27 +421,27 @@ msgid "label_show_full_comment_text" msgstr "Näytä kokonaan" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Aihe" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/fr/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/fr/LC_MESSAGES/plone.app.discussion.po index 23f449b..727f7ad 100644 --- a/plone/app/discussion/locales/fr/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/fr/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Un commentaire a été posté." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Un id de commentaire unique pour cette conversation" @@ -26,43 +26,67 @@ msgstr "Un id de commentaire unique pour cette conversation" msgid "Add a comment" msgstr "Ajouter un commentaire" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Commentaires anonymes" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Annuler" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Modifications enregistrées" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Commentaire approuvé." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Commentaire supprimé." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Portrait de l'utilisateur" msgid "Commenting infrastructure for Plone" msgstr "Infrastructure pour déposer des commentaires." -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversation" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Date de création" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "Date du dernier commentaire public" @@ -70,43 +94,43 @@ msgstr "Date du dernier commentaire public" msgid "Disabled" msgstr "Désactivé" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Paramètres des discussions" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Édition annulée" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Adresse courriel" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Activation des commentaires" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id du commentaire dont ce commentaire répond" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "Type MIME" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notification du modérateur par courriel" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Date de modification" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nom" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "M'avertir des nouveaux commentaires par courriel." @@ -114,44 +138,44 @@ msgstr "M'avertir des nouveaux commentaires par courriel." msgid "Plone Discussions" msgstr "Plone Discussions" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Portal type" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Enregistrer" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "L'ensemble des commentateurs uniques (identifiants)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "L'ensemble des commentateurs uniques des commentaires publiés (identifiants)" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "Nombre total de commentaires publics sur cet élément" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "Transformation '%s' => '%s' indisponible. La transformation du commentaire '%s' a échoué." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notification des utilisateurs par courriel" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "Identifiant de l'auteur du commentaire" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Votre commentaire attend d'être modéré." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Commenter" @@ -165,6 +189,11 @@ msgstr "Supprimer" msgid "bulkactions_publish" msgstr "Approuver" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,11 +214,31 @@ msgstr "Les commentaires sont modérés." msgid "comment_description_plain_text" msgstr "Vous pouvez ajouter un commentaire en complétant le formulaire ci-dessous. Le format doit être plain text." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "${author_name} sur ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -221,75 +270,81 @@ msgid "heading_moderate_comments" msgstr "Modération des commentaires" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Si activé, les utilisateurs anonymes peuvent poster des commentaires sans se connecter. Il est fortement recommandé d'utiliser un captcha pour prévenir du spam si cette option est activée." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "Si cette case est cochée, les utilisateurs anonymes devront donner leur email." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Utilisez cette option pour activer la validation par captcha pour les commentaires. Installez plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet ou collective.z3cform.norobots s'il n'y a aucune option de disponible." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Certaines options liées aux discussions ne sont pas dans \"Paramètres des discussions\".\n" "Pour activer les commentaires pour un type de contenu spécifique, allez dans \"Paramètres des types\", choisissez \"Commentaire\" et sélectionnez le workflow \"Workflow de modération des commentaires\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Si vous cochez cette case, les utilisateurs pourront poster des commentaires sur ce site. Vous devez néanmoins activer les commentaires pour des types de contenu spécifiques, dossiers, ou éléments avant que les utilisateurs puissent poster des commentaires." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Si cette case est cochée, les commentaires ajoutés seront mis 'en attente' et seront invisibles pour les visiteurs. Un utilisateur ayant la permission 'Review comments' (Modérateur ou Administrateur) peut approuver les commentaires pour les rendre visibles. Vous pouvez choisir un workflow spécifique pour les commentaires depuis le menu de configuration des types de contenu." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Addresse à laquelle les notifications de modération seront envoyées." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Si activé, le modérateur est notifié si un commentaire requiert une attention particulière. Le courriel du modérateur est défini sur la page 'Envoi de courriels' de la configuration du site (Adresse d'expéditeur des courriels)." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Si activé, le portrait de l'utilisateur apparait à côté du commentaire." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Choisissez si le texte des commentaires doit être éventuellement transformé. Vous pouvez choisir entre 'Plain text' et 'Intelligent text'. Ce dernier convertit le texte en HTML, en préservant notamment les retours chariots et l'indentation, et en transformant les url et les addresses courriel en liens cliquables." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Si vous cochez cette case, les utilisateurs pourront choisir d'être avertis par courriel des nouveaux commentaires." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonyme" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Activer les commentaires anonymes" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "Activer le champ email pour les anonymes" @@ -299,17 +354,17 @@ msgid "label_apply" msgstr "Appliquer" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Commentaire" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Les commentaires ont été désactivés." @@ -318,13 +373,18 @@ msgstr "Les commentaires ont été désactivés." msgid "label_delete" msgstr "Supprimer" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Activer globalement les commentaires" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Activer la modération des commentaires" @@ -344,12 +404,12 @@ msgid "label_publish" msgstr "Approuver" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "a écrit :" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Afficher le portrait de l'utilisateur" @@ -359,29 +419,45 @@ msgid "label_show_full_comment_text" msgstr "afficher le texte complet du commentaire" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Sujet" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformation du texte du commentaire" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Activer la notification par courriel des utilisateurs" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" -msgstr "Un commentaire a été ajouté sur '${title}' à cette addresse : ${link}\n\n---\n${text}\n---\n" +msgstr "" +"Un commentaire a été ajouté sur '${title}' à cette addresse : ${link}\n" +"\n" +"---\n" +"${text}\n" +"---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" -msgstr "Un commentaire a été ajouté sur '${title}' à cette addresse : ${link}\n\n---\n${text}\n---\n\nApprover le commentaire :\n${link_approve}\n\nSupprimer le commentaire :\n${link_delete}\n" +msgstr "" +"Un commentaire a été ajouté sur '${title}' à cette addresse : ${link}\n" +"\n" +"---\n" +"${text}\n" +"---\n" +"\n" +"Approver le commentaire :\n" +"${link_approve}\n" +"\n" +"Supprimer le commentaire :\n" +"${link_delete}\n" #. Default: "enable the 'Comment Review Workflow' for the Comment content type" #: ../browser/moderation.pt:33 diff --git a/plone/app/discussion/locales/it/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/it/LC_MESSAGES/plone.app.discussion.po index 8f8a427..eb08564 100644 --- a/plone/app/discussion/locales/it/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/it/LC_MESSAGES/plone.app.discussion.po @@ -1,12 +1,12 @@ # Translation of plone.app.discussion.pot to Italian # Luca Fabbri , 2010 -# +# msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" "PO-Revision-Date: 2011-05-13 18:10+0100\n" -"Last-Translator: Giorgio Borelli \n" +"Last-Translator: Andrea Cecchi \n" "Language-Team: Plone i18n \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -18,11 +18,11 @@ msgstr "" "Domain: plone.app.discussion\n" "X-Is-Fallback-For: it-it it-ch it-sm it-hr it-si\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Un commento è stato inserito." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Id univoco del commento per questa conversazione" @@ -30,87 +30,111 @@ msgstr "Id univoco del commento per questa conversazione" msgid "Add a comment" msgstr "Aggiungi un commento" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Commenti Anonimi" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Annulla" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Modifiche salvate" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Commento approvato." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "Email dell'autore del commento" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "Nome dell'autore del commento" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "Username dell'autore del commento" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Commento eliminato." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "Id commento" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "Testo commento" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Immagine Commentatore" msgid "Commenting infrastructure for Plone" msgstr "Infrastruttura dei commenti per Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "Commenti" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversazione" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Data di creazione" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "Data del commento pubblico più recente" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Disabilitato" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Impostazioni dei commenti" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Modifiche annullate" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Abilita commenti" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id del commento a cui si risponde" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notifiche e-mail" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Data di modifica" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nome" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Notificami nuovi commenti via e-mail" @@ -118,44 +142,44 @@ msgstr "Notificami nuovi commenti via e-mail" msgid "Plone Discussions" msgstr "Supporto ai commenti Plone" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tipo di contenuto" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Salva" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "L'insieme unico dei commentatori (username)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "La lista di commentatori unici (username) dei commenti pubblicati" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" -msgstr "" +msgstr "Numero totale di commenti pubblicati per questo contenuto" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Trasform '%s' => '%s' non disponibile." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notifiche utenti via e-mail" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "Username dell'autore del commento" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Il tuo commento è in attesa di approvazione" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Commenta" @@ -169,16 +193,20 @@ msgstr "Elimina" msgid "bulkactions_publish" msgstr "Approva" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "Annulla" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 -#, fuzzy msgid "comment_description_intelligent_text" msgstr "Puoi aggiungere un commento compilando la form qui sotto. Utilizza testo semplice. Indirizzi web ed email saranno trasformati in collegamenti cliccabili." #. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." #: ../browser/comments.py:51 msgid "comment_description_markdown" -msgstr "" +msgstr "Puoi aggiungere un commento compilando la form qui sotto. Utilizza testo semplice. Puoi utilizzare la sintassi Markdown per link ed immagini." #. Default: "Comments are moderated." #: ../browser/comments.py:63 @@ -187,15 +215,33 @@ msgstr "I commenti vengono moderati." #. Default: "You can add a comment by filling out the form below. Plain text formatting." #: ../browser/comments.py:46 -#, fuzzy msgid "comment_description_plain_text" msgstr "Puoi aggiungere un commento compilando la form sotto. Utilizza il testo semplice." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "Modifica del commento annullata" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "Il commento è stato modificato" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" -msgstr "${creator} su ${content}" +msgstr "${author_name} su ${content}" + +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "Modifica commento" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "Modifica commento" #. Default: "Action" #: ../browser/moderation.pt:85 @@ -228,78 +274,83 @@ msgid "heading_moderate_comments" msgstr "Moderazione commenti" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Se selezionato, gli utenti anonimi saranno in grado di inserire commenti senza autenticazione. E' altamente consigliato l'uso di captcha to prevenire spam se questa impostazione viene abilitata." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" -msgstr "" +msgstr "Se selezionato, gli utenti anonimi dovranno fornire la loro email." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Usa questa impostazione per abilitare o disabilitare la validazione tramite captcha. Se nessuna opzione di captcha è disponibile, installa plone.formwidget.captcha o plone.formwidget.recaptcha." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Alcune impostazioni legate ai commenti non sono nel Pannello di controllo commenti.\n" "Per abilitare i commenti per uno specifico tipo di contenuto, vai al Pannello dei Tipi di Contenuto per il tipo specifico e scegli 'abilita moderazione'.\n" "Per abilitare il workflow per la moderazione dei commenti, vai al Pannello dei Tipi di Contenuto, scegli \"Comment\" e imposta il workflow \"Comment Review Workflow\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "Se selezionato, verrà abilitato il supporto alla modifica dei commenti da parte degli utenti che hanno il permesso 'Edit comments'." + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Se selezionato, gli utenti saranno in grado di inserire commenti nel sito. Comunque, dovrai abilitare i commenti per specifici tipi di contenuto, cartelle o oggetti prima che gli utenti siano in grado di commentare." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Se selezionato, i commenti verranno creati in stato 'In attesa' in cui sono non sono visibili pubblicamente. Un utento con il permesso 'Revisiona i commenti' ('Revisore' o 'Manager') possono approvare i commenti per renderli pubblici. Se si vuole abilitare un workflow personalizzato per i commenti, bisogna andare nel pannello di controllo dei tipi." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Indirizzo a cui verranno spedite le notifiche per la moderazione." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" -msgstr "Se selezionato il moderatore riceverà una notifica se il commento dovrà necessita della sua attenzione. L'indirizzo email del moderatore può essere impostato nel pannello di controllo nella sezione 'Posta' (Indirizzo 'mittente' del sito)" +msgstr "Se selezionato il moderatore riceverà una notifica se il commento necessiterà della sua attenzione. L'indirizzo email del moderatore può essere impostato nel campo sottostante." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Se selezionato, un'immagine dell'utente verrà mostrata a fianco dei commenti." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Utilizzare questa impostazione per scegliere se il testo del commento deve essere trasformato in qualche modo. E' possibile scegliere tra 'Plain text' e 'Testo intelligente'. 'Testo intelligente' converte il testo in HTML dove le interruzioni di linea e le indentazioni vengono preservate, e gli indirizzi web o email vengono trasformati in collegamenti cliccabili." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Se selezionato, gli utenti possono scegliere di essere notificati ad ogni nuovo commenti via e-mail." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonimo" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Abilita i commenti agli utenti anonimi" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "Abilita campo email per utenti anonimi" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -307,17 +358,17 @@ msgid "label_apply" msgstr "Applica" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Commento" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "I commenti sono stati disabilitati." @@ -326,13 +377,18 @@ msgstr "I commenti sono stati disabilitati." msgid "label_delete" msgstr "Elimina" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "Abilita la modifica dei commenti" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Abilita globalmente i commenti" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Abilita la moderazione dei commenti" @@ -352,12 +408,12 @@ msgid "label_publish" msgstr "Approva" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr ":" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Visualizza le immagini dei commentatori" @@ -367,22 +423,22 @@ msgid "label_show_full_comment_text" msgstr "mostra testo completo del commento" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Oggetto" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformazioni testo del commento" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Abilita notifica via e-mail" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Un commento a '${title}' è stato inserito qui: ${link}\n" @@ -392,7 +448,7 @@ msgstr "" "---" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Un commento su '${title}' è stato aggiunto qui: ${link}\n" diff --git a/plone/app/discussion/locales/ja/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/ja/LC_MESSAGES/plone.app.discussion.po index a4d4142..3f698d3 100644 --- a/plone/app/discussion/locales/ja/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/ja/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: DOMAIN\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "コメントが投稿されました" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "このカンバセーションにユニークなコメントID" @@ -26,43 +26,67 @@ msgstr "このカンバセーションにユニークなコメントID" msgid "Add a comment" msgstr "コメントを追加" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "無名コメント" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "取り消す" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "変更が保存されました" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "コメントが承認されました" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "コメントが削除されました" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "コメント者の画像" msgid "Commenting infrastructure for Plone" msgstr "Ploneのコメント基盤" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "カンバセーション" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "作成日付" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -70,43 +94,43 @@ msgstr "" msgid "Disabled" msgstr "無効になりました" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "議論の設定" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "編集が取り消されました" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "メール" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "コメントを有効にする" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "このコメントが回答する先であるコメントのID" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIMEタイプ" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "モデレータへのメール通知" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "変更日付" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "名前" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "新しいコメントを私にメールで知らせる" @@ -114,44 +138,44 @@ msgstr "新しいコメントを私にメールで知らせる" msgid "Plone Discussions" msgstr "Plone 議論" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "ポータルタイプ" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "保存" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "ユニークなコメント者(ユーザ名)のセット" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "ユーザへのメール通知" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "コメントは司会の承認を待ちます" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "コメント" @@ -165,6 +189,11 @@ msgstr "削除する" msgid "bulkactions_publish" msgstr "承認する" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,12 +214,32 @@ msgstr "コメントはモデレートされました" msgid "comment_description_plain_text" msgstr "下のフォームに書き込むことで、コメントを追加することができます。プレーンテキスト形式です。" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} が ${content} にコメント" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -222,76 +271,82 @@ msgid "heading_moderate_comments" msgstr "コメントをモデレートする" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "選ばれると、ログインせずに無名ユーザがコメントを投稿できるようになります。もしこの設定が有効にされるなら、キャプチャを使ってスパムを防ぐ解決策をとることをお勧めします。" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "コメントでのキャプチャ検査を有効にするか無効にするかを設定するのにこれを使います。もし選択できないようになっていたら、 plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet または collective.z3cform.norobots をインストールしてください。" #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "議論に関係するいくつかの設定は、議論コントロールパネルに置かれていません。\n" "特定のコンテンツタイプに対してコメントを有効にするには、タイプコントロールパネルに行ってそのコンテンツタイプを選び、「コメントを許す」を選びます。\n" "コメントに対してモデレーションワークフローを有効にするには、タイプコントロールパネルに行き、「コメント」を選び、ワークフローを「コメント審査ワークフロー」に設定します。" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "選ばれると、このサイトでユーザがコメントを投稿できるようになります。とはいえ、ユーザがコメントを投稿できるようになるためには、さらにコンテンツタイプ、フォルダ、コンテンツオブジェクトに対して、コメントを有効にしなければなりません。" #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "選ばれると、コメントは投稿されると一般公衆からは見えない「保留」状態になります。「コメントを審査(Review comments}」パーミッションを持つユーザ、つまり審査員あるいは管理者がコメントを一般に見えるように承認することができます。カスタムコメントワークフローを有効にしたいなら、タイプコントロールパネルに行く必要があります。" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "モデレータへの通知が送られる送付先アドレス" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "選ばれると、コメントが注意を要するものであるかどうか、モデレータは通知を受けるようになります。モデレータのメールアドレスはメール設定コントロールパネルの中のサイト「差出人」アドレスです。" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "選ばれると、コメントの隣にユーザの画像が見えるようになります。" #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "コメントテキストがなんらかの形で変換されるべきかどうかを選ぶのに、この設定を使います。「プレーンテキスト」と「インテリジェントテキスト」の間で選べるようになります。「インテリジェントテキスト」はプレーンテキストをHTMLに変換します。改行とインデントは温存され、Webアドレスやメールアドレスはクリッカブルリンクになります。" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "選ばれると、新しいコメントをメールによって通知してもらうように、ユーザが選べるようになります。" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "無名" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "無名コメントを有効にする" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -301,17 +356,17 @@ msgid "label_apply" msgstr "適用" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "キャプチャ" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "コメント" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "コメント機能が無効になりました" @@ -320,13 +375,18 @@ msgstr "コメント機能が無効になりました" msgid "label_delete" msgstr "削除" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "サイト全体でコメントを有効にする" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "コメントのモデレーションを有効にする" @@ -346,12 +406,12 @@ msgid "label_publish" msgstr "承認" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "曰く:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "コメント者の画像を見せる" @@ -361,28 +421,28 @@ msgid "label_show_full_comment_text" msgstr "コメントテキストをそのまま見せる" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "題目" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "コメントテキスト変換" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "ユーザへのメール通知を有効にする" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 #, fuzzy msgid "mail_notification_message" msgstr "'${title}' へのコメントが、ここに投稿されました: ${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/nl/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/nl/LC_MESSAGES/plone.app.discussion.po index 68dca59..e18e853 100644 --- a/plone/app/discussion/locales/nl/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/nl/LC_MESSAGES/plone.app.discussion.po @@ -15,11 +15,11 @@ msgstr "" "Domain: plone.app.discussion\n" "Language: nl\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Commentaar is geplaatst" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Een unieke ID voor dit commentaar" @@ -27,43 +27,67 @@ msgstr "Een unieke ID voor dit commentaar" msgid "Add a comment" msgstr "Voeg opmerking toe" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anoniem commentaar" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Annuleren" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Wijzigingen opgeslagen" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Commentaar goedgekeurd" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Commentaar verwijderd" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Profielfoto commentator" msgid "Commenting infrastructure for Plone" msgstr "Reactie infrastructuur voor Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversatie" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Aanmaakdatum" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -71,43 +95,43 @@ msgstr "" msgid "Disabled" msgstr "Uitgeschakeld" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Discussie instellingen" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Bewerken geannulleerd." -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Commentaar toestaan" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id van commentaar waarop deze commentaar reageert" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "E-mail notificatie voor de redactie" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Wijzigingsdatum" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Naam" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Hou me middels e-mail op de hoogte van nieuwe commentaar." @@ -115,44 +139,44 @@ msgstr "Hou me middels e-mail op de hoogte van nieuwe commentaar." msgid "Plone Discussions" msgstr "Plone Discussies" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "type" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Bewaren" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Lijst van commentatoren (gebruikernamen)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Gebruker E-mail Notificatie" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Je commentaar zal geplaatst worden na goedkeuring." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Commentaar toevoegen" @@ -166,6 +190,11 @@ msgstr "Verwijderen" msgid "bulkactions_publish" msgstr "Publiceren" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -186,12 +215,32 @@ msgstr "Commentaren zijn gemodereerd." msgid "comment_description_plain_text" msgstr "U kunt commentaar toevoegen door onderstaand formulier in te vullen. Platte tekst formaat." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} over ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -223,73 +272,79 @@ msgid "heading_moderate_comments" msgstr "Commentaar modereren" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Indien geselecteerd, anonieme bezoekers kunnen commentaar achterlaten zonder in te loggen. Het is aanbevolen om de captcha-oplossing te gebruiken om spam te voorkomen als deze optie is ingeschakeld." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Indien geselecteerd, Captcha validatie wordt gebruikt voor het commentaar. Installeer plone.formwidget of plone.formwidget.recaptcha als er geen opties beschikbaar zijn." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "Sommige discussie instellingen staan niet op deze pagina. Om commentaar in te schakelen voor een specifiek content-type, ga naar het Typen instellingenscherm van het betreffende type en kies 'commentaar toestaan'. Om de moderatie-workflow in te schakelen, ga naar het Typen instellingenscherm en kies het type 'Comment' stel de 'Comment Review Workflow' in." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Indien geselecteerd, gebruikers kunnen commentaar plaatsen op de site. Het kan zijn dat commentaar voor een specifiek content-type ingeschakeld moet worden voordat commentaar mogelijk is." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Indien geselecteerd, de moderator zal ingelicht worden als een commentaar aandacht nodig heeft." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Emailadres van de moderator naar wie een notificatie zal worden gestuurd." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Indien geselecteerd, de moderator zal ingelicht worden als een commentaar aandacht nodig heeft." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Indien geselecteerd, de profielfoto van een gebruiker wordt naast het commentaar getoond." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Gebruik deze instelling om ervoor te kiezen of de commentaar tekst getransformeerd moet worden. U kunt kiezen uit 'Platte tekst' en 'Intelligente tekst'. 'Intelligente tekst' zet platte tekst om in HTML waarbij nieuwe regels en inspringen worden gehandhaaft, en waarbij web en e-mail adressen in klikbare links worden omgezet." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Indien geselecteerd kunnen gebruikers ervoor kiezen per e-mail bericht te ontvangen van nieuwe commentaar." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anoniem" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Anoniem commentariëren inschakelen" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -299,17 +354,17 @@ msgid "label_apply" msgstr "Toepassen" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Commentaar" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Commentaar is uitgeschakeld" @@ -318,13 +373,18 @@ msgstr "Commentaar is uitgeschakeld" msgid "label_delete" msgstr "Verwijderen" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Commentaar globaal toestaan" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Moderatie is ingeschakeld" @@ -344,12 +404,12 @@ msgid "label_publish" msgstr "Publiceren" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "zegt:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Toon portret commentator" @@ -359,27 +419,27 @@ msgid "label_show_full_comment_text" msgstr "Toon het volledige commentaar" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Onderwerp" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Reactie tekst transformatie" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Gebruikers-notificatie ingeschakeld" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "Een commentaar op '${title}' is geplaatst: ${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "Commentaar op '${title}' is geplaatst: ${link}" diff --git a/plone/app/discussion/locales/no/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/no/LC_MESSAGES/plone.app.discussion.po index 6b94ac8..2066853 100644 --- a/plone/app/discussion/locales/no/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/no/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "En kommentar-id unik for denne kommentaren" @@ -26,43 +26,67 @@ msgstr "En kommentar-id unik for denne kommentaren" msgid "Add a comment" msgstr "Legg til en kommentar" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonym kommentar" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Avbryt" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Kommentaren er godkjent" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Kommentaren er slettet" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Forfatterbilde" msgid "Commenting infrastructure for Plone" msgstr "" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Diskusjon" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Dato opprettet" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -70,43 +94,43 @@ msgstr "" msgid "Disabled" msgstr "Slått av" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Innstillinger for kommentarer" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-post" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Slå på kommentarer" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id til kommentar som denne kommentaren er en kommentar til" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Varsling av moderator på epost" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Endringsdato" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Navn" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "" @@ -114,44 +138,44 @@ msgstr "" msgid "Plone Discussions" msgstr "" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Portaltype" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Listen over forfattere (brukernavn)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Kommentaren venter på godkjenning av moderator." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Kommentér" @@ -165,6 +189,11 @@ msgstr "Slett" msgid "bulkactions_publish" msgstr "Godkjenn" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,11 +214,31 @@ msgstr "" msgid "comment_description_plain_text" msgstr "" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -221,79 +270,84 @@ msgid "heading_moderate_comments" msgstr "Moderer kommentar" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Dersom innstillingen er valgt kan anonyme brukere kommentere uten å logge inn. Det er anbefalt å bruke en captcha-løsning for å forhindre nettsøppel dersom denne innstillingen er valgt" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 #, fuzzy msgid "help_captcha" msgstr "Bruk denne innstillingen for å aktivere eller deaktivere captcha-validering av kommentarer. Installér plone.formwidget.captcha eller plone.formwidget.recaptcha dersom det mangler valg her." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 #, fuzzy msgid "help_discussion_settings_editform" msgstr "" "Noen innstillinger for kommentarer finnes utenfor kontrollpanelet for kommentarer. For å aktivere kommentarer for en spesifíkk innholdstype må man gå til kontrollpanelet for denne innholdstypen og velge 'aktiver moderering'.\n" "For å aktivere arbeidsflyten for moderering, må man gå til kontrollpanelet for innholdstyper og velge \"Kommentarer\" og stille inn arbeidsflyten til å vere \"Comment Review Workflow\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 #, fuzzy msgid "help_globally_enabled" msgstr "Dersom denne instillingen er valgt kan brukerene legge til kommentarer på nettstedet. Men du må likevel aktivere kommentarer for spesifikke innholdstyper, mapper eller innholdsobjekter før brukerene får lov til å legge til kommentarer." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 #, fuzzy msgid "help_moderator_notification_enabled" msgstr "Dersom innstillingen er valgt vil moderatoren bli varslet når en kommentar er lagt til." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Dersom denne er valgt vil bildet av brukeren vise ved siden av kommentaren." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -303,17 +357,17 @@ msgid "label_apply" msgstr "Bruk" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "" @@ -322,13 +376,18 @@ msgstr "" msgid "label_delete" msgstr "Slett" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Aktiver kommentarer globalt" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "" @@ -348,12 +407,12 @@ msgid "label_publish" msgstr "Godkjenn" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "" @@ -363,27 +422,27 @@ msgid "label_show_full_comment_text" msgstr "Vis hele kommentaren" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/plone.app.discussion.pot b/plone/app/discussion/locales/plone.app.discussion.pot index 1a7bd37..8fa8488 100644 --- a/plone/app/discussion/locales/plone.app.discussion.pot +++ b/plone/app/discussion/locales/plone.app.discussion.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" -"POT-Creation-Date: 2013-04-06 12:48+0000\n" +"POT-Creation-Date: 2014-05-16 13:47+0000\n" "PO-Revision-Date: 2010-01-28 15:00+0000\n" "Last-Translator: Hanno Schlichting \n" "Language-Team: Hanno Schlichting \n" @@ -18,11 +18,11 @@ msgstr "" msgid "" msgstr "" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "" @@ -30,43 +30,67 @@ msgstr "" msgid "Add a comment" msgstr "" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "" msgid "Commenting infrastructure for Plone" msgstr "" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -74,43 +98,43 @@ msgstr "" msgid "Disabled" msgstr "" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "" @@ -118,44 +142,44 @@ msgstr "" msgid "Plone Discussions" msgstr "" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "" @@ -169,6 +193,11 @@ msgstr "" msgid "bulkactions_publish" msgstr "" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -189,11 +218,31 @@ msgstr "" msgid "comment_description_plain_text" msgstr "" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -225,73 +274,78 @@ msgid "heading_moderate_comments" msgstr "" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "" #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "" #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" msgstr "" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "" #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -301,17 +355,17 @@ msgid "label_apply" msgstr "" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "" @@ -320,13 +374,18 @@ msgstr "" msgid "label_delete" msgstr "" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "" @@ -346,12 +405,12 @@ msgid "label_publish" msgstr "" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "" @@ -361,27 +420,27 @@ msgid "label_show_full_comment_text" msgstr "" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/pt/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/pt/LC_MESSAGES/plone.app.discussion.po index 2e56bed..07cad35 100644 --- a/plone/app/discussion/locales/pt/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/pt/LC_MESSAGES/plone.app.discussion.po @@ -15,103 +15,123 @@ msgstr "" "Domain: plone.app.discussion\n" "X-Poedit-Language: Português\n" -#: ../comment.py:264 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Foi adicionado um comentário." -#: ../interfaces.py:257 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Um id do comentário único para esta conversação." -#: ../browser/comments.py:67 +#: ../browser/comments.py:72 msgid "Add a comment" msgstr "Adicionar comentário" -#: ../browser/controlpanel.py:62 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Comentários Anónimos" -#: ../interfaces.py:282 -msgid "Author name (for display)" -msgstr "Nome do autor (para exibição)" - -#: ../browser/comments.py:248 -#: ../browser/controlpanel.py:80 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Cancelar" -#: ../browser/controlpanel.py:76 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Alterações guardadas" -#: ../browser/moderation.py:133 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Comentário aprovado" -#: ../browser/moderation.py:94 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Comentário excluído." -#: ../browser/controlpanel.py:63 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Imagem do comentador" msgid "Commenting infrastructure for Plone" msgstr "Infraestrutura de comentários para o Plone" -#: ../interfaces.py:252 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversação" -#: ../interfaces.py:283 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Data de criação" -#: ../interfaces.py:162 -msgid "Date of the most recent comment" -msgstr "Data do comentário mais recente" +#: ../interfaces.py:41 +msgid "Date of the most recent public comment" +msgstr "" #: ../vocabularies.py:44 msgid "Disabled" msgstr "Desativado" -#: ../browser/controlpanel.py:32 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Configurações da discussão" -#: ../browser/controlpanel.py:82 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Edição cancelada" -#: ../interfaces.py:269 +#: ../interfaces.py:156 msgid "Email" msgstr "Email" -#: ../browser/controlpanel.py:61 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Permitir comentários" -#: ../interfaces.py:260 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "ID do comentário para qual este comentário é resposta" -#: ../interfaces.py:274 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME type" -#: ../browser/controlpanel.py:65 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificação de e-mail para o moderador" -#: ../interfaces.py:284 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Data de modificação" -#: ../interfaces.py:254 +#: ../interfaces.py:141 msgid "Name" msgstr "Nome" -#: ../interfaces.py:278 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Notificar-me por email da existência de novos comentários." @@ -119,32 +139,44 @@ msgstr "Notificar-me por email da existência de novos comentários." msgid "Plone Discussions" msgstr "Discussões Plone" -#: ../interfaces.py:247 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tipo de conteúdo" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Guardar" -#: ../interfaces.py:167 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Lista de utilizadores que fizeram comentários (nome de utilizador)" -#: ../interfaces.py:156 -msgid "Total number of comments on this item" -msgstr "Número total de comentários para este item" +#: ../interfaces.py:51 +msgid "The set of unique commentators (usernames) of published_comments" +msgstr "" -#: ../browser/controlpanel.py:67 +#: ../interfaces.py:35 +msgid "Total number of public comments on this item" +msgstr "" + +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "" + +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notificar o utilizador por email" -#: ../browser/comments.py:241 +#: ../interfaces.py:176 +msgid "Username of the commenter" +msgstr "" + +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Seu comentário encontra-se pendente e aguarda a aprovação do moderador." #. Default: "Comment" -#: ../browser/comments.py:123 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Comentar" @@ -158,26 +190,57 @@ msgstr "Excluir" msgid "bulkactions_publish" msgstr "Publicar" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." -#: ../browser/comments.py:52 +#: ../browser/comments.py:57 msgid "comment_description_intelligent_text" msgstr "Pode adicionar um comentário usando o formulário a seguir. Campo de texto simples. Endereços web e e-mail são transformados em links clicáveis." +#. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." +#: ../browser/comments.py:51 +msgid "comment_description_markdown" +msgstr "" + #. Default: "Comments are moderated." -#: ../browser/comments.py:58 +#: ../browser/comments.py:63 msgid "comment_description_moderation_enabled" msgstr "Os comentários são moderados" #. Default: "You can add a comment by filling out the form below. Plain text formatting." -#: ../browser/comments.py:47 +#: ../browser/comments.py:46 msgid "comment_description_plain_text" msgstr "Pode adicionar um comentário usando o formulário a seguir. Campo de texto simples." -#. Default: "${creator} on ${content}" -#: ../comment.py:46 +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + +#. Default: "${author_name} on ${content}" +#: ../comment.py:55 +#, fuzzy msgid "comment_title" msgstr "${creator} em ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -209,85 +272,102 @@ msgid "heading_moderate_comments" msgstr "Moderar comentários" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:38 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Se selecionado, os utilizadores anonimos poderão adicionar comentários sem estar autenticados. É altamente recomendável a utilização de uma solução de captcha para evitar spam quando esta configuração está activa." +#. Default: "If selected, anonymous user will have to give their email." +#: ../interfaces.py:341 +msgid "help_anonymous_email_enabled" +msgstr "" + #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:82 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Utilize esta opção para ativar ou desativar o Captcha para os comentários. Instale plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet ou collective.z3cform.norobots caso não tenha nenhuma opção disponível." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:33 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Algumas configurações relacionadas com os comentários não se encontram localizadas no Painel de Controle de Comentários.\n" "Para activar os comentários para um tipo de item específico, aceda à configuração de Tipos no Painel de Controle, encontre o tipo desejado e selecione \"Permitir comentários \".\n" "Para ativar o workflow de moderação de comentários, aceda à configuração de Tipos no Painel de Controle, escolha \"Comentário\" e selecione o workflow para \"Workflow de Revisão de Comentários\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:26 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Se selecionado, permite que os visitantes adicionem comentários ao site. Porém, você deve habilitar comentários para cada tipo de conteúdo antes que os usuários possam adicionar comentários." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:50 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Se selecionado, os comentários serão adicionados no estado \"Pendente\", que é invisível ao público. Utilizadores com permissão para 'Moderar Comentários' ('Gestor' ou 'Administrador') podem aprovar os comentários para torná-los visíveis ao público. Caso queira ativar um workflow de comentários personalizado, aceda à Configuração dos Tipos no Painel de Controle." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:118 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Endereço para o qual as notificações do moderador serão enviadas." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" -#: ../interfaces.py:107 +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." +#: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Se selecionado, o moderador será avisado quando um comentário precisar de atenção. O endereço de e-mail do moderador pode ser encontrado nas configurações de e-mail no Painel de Controle (campo Endereço de 'Remetente' do site)" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:97 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Se selecionado, uma imagem do usuário será exibida próxima ao comentário." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:66 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Use esta configuração para escolher se o texto do comentário deve ser transformado. Você pode escolher entre 'texto puro' e 'texto inteligente'. 'Texto inteligente' converte texto simples em HTML, onde as quebras de linha e os recuos são preservados, e os endereços web e e-mail são transformados em links clicáveis." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:127 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Se selecionado, permite aos usuários solicitar o notificações por e-mail sempre que hover um novo comentário." #. Default: "Anonymous" -#: ../comment.py:156 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anónimo" #. Default: "Enable anonymous comments" -#: ../interfaces.py:36 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Permitir comentários anónimos." +#. Default: "Enable anonymous email field" +#: ../interfaces.py:339 +msgid "label_anonymous_email_enabled" +msgstr "" + #. Default: "Apply" #: ../browser/moderation.pt:71 msgid "label_apply" msgstr "Aplicar" #. Default: "Captcha" -#: ../interfaces.py:80 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:275 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Comentário" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Os comentários foram desativados." @@ -296,23 +376,28 @@ msgstr "Os comentários foram desativados." msgid "label_delete" msgstr "Excluir" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:24 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Ativar comentários globalmente" #. Default: "Enable comment moderation" -#: ../interfaces.py:48 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Ativar moderação de comentários" #. Default: "Moderator Email Address" -#: ../interfaces.py:117 +#: ../interfaces.py:314 msgid "label_moderator_email" msgstr "Endereço de e-mail do moderador" #. Default: "Enable moderator email notification" -#: ../interfaces.py:105 +#: ../interfaces.py:302 msgid "label_moderator_notification_enabled" msgstr "Ativar notificação ao moderador" @@ -322,12 +407,12 @@ msgid "label_publish" msgstr "Aprovar" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "disse:" #. Default: "Show commenter image" -#: ../interfaces.py:95 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Exibir imagem do autor" @@ -337,30 +422,41 @@ msgid "label_show_full_comment_text" msgstr "Exibir texto completo" #. Default: "Subject" -#: ../interfaces.py:271 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Assunto" #. Default: "Comment text transform" -#: ../interfaces.py:64 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformações aplicadas ao texto do comentário" #. Default: "Enable user email notification" -#: ../interfaces.py:125 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Activar notificação de utilizadores por email" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:50 +#: ../comment.py:59 #, fuzzy msgid "mail_notification_message" msgstr "Um comentário em '${title}' foi adicionado aqui: ${link}" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:58 +#: ../comment.py:67 msgid "mail_notification_message_moderator" -msgstr "Um comentário sobre '${title}' foi adicionado aqui: ${link}\n\n---\n${text}\n---\n\nAprovar comentário:\n${link_approve}\n\nApagar comentário:\n${link_delete}\n" +msgstr "" +"Um comentário sobre '${title}' foi adicionado aqui: ${link}\n" +"\n" +"---\n" +"${text}\n" +"---\n" +"\n" +"Aprovar comentário:\n" +"${link_approve}\n" +"\n" +"Apagar comentário:\n" +"${link_delete}\n" #. Default: "enable the 'Comment Review Workflow' for the Comment content type" #: ../browser/moderation.pt:33 @@ -381,3 +477,4 @@ msgstr "Nenhum comentário para moderação." #: ../browser/moderation.pt:64 msgid "title_bulkactions" msgstr "Ações em massa" + diff --git a/plone/app/discussion/locales/pt_BR/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/pt_BR/LC_MESSAGES/plone.app.discussion.po index 17b5cba..be8a3c0 100644 --- a/plone/app/discussion/locales/pt_BR/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/pt_BR/LC_MESSAGES/plone.app.discussion.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" -"PO-Revision-Date: 2013-04-06 14:49+0200\n" -"Last-Translator: Andre Nogueira \n" +"PO-Revision-Date: 2014-12-05 17:36+0200\n" +"Last-Translator: Joao Molon \n" "Language-Team: Plone i18n \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -15,11 +15,11 @@ msgstr "" "Domain: plone.app.discussion\n" "X-Poedit-Language: Português do Brasil\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Comentário adicionado." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Um comentário com ID exclusivo para esta conversação" @@ -27,43 +27,67 @@ msgstr "Um comentário com ID exclusivo para esta conversação" msgid "Add a comment" msgstr "Adicionar comentário" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Comentários Anônimos" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Cancelar" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Alterações salvas" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Comentário aprovado" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "Email do autor do comentário" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "Nome completo do autor do comentário" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "Nome de usuário do autor do comentário" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Comentário excluído." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "Id do comentário" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "Texto do comentário" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" -msgstr "Imagedo autor" +msgstr "Imagem do autor" msgid "Commenting infrastructure for Plone" msgstr "Infraestrutura de comentários para o Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "Comentários" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversação" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Data de criação" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "Data do comentário, público, mais recente" @@ -71,43 +95,43 @@ msgstr "Data do comentário, público, mais recente" msgid "Disabled" msgstr "Desativado" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Configurações da discussão" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Edição cancelada" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Permitir comentários" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "ID do comentário para qual este comentário é resposta" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificação de e-mail para o moderador" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Data de modificação" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nome" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Receber avisos por e-mail para novos comentários." @@ -115,44 +139,44 @@ msgstr "Receber avisos por e-mail para novos comentários." msgid "Plone Discussions" msgstr "Plone Discussions" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tipo de objeto" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Salvar" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Lista de usuários que fizeram comentários (nome de usuário)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "O grupo de comentadoristas (nomes de usuários) com comentários publicados" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "Número total de comentários públicos neste item" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "A transformação '%s' => '%s' não está disponível. Ocorreu uma falha ao transformar o comentário '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Transformação '%s' => '%s' não disponível" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notificação de e-mail para o usuário" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "Nome de usuário do comentarista" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Seu comentário está pendente e aguarda a aprovação do moderador." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Comentar" @@ -166,6 +190,11 @@ msgstr "Excluir" msgid "bulkactions_publish" msgstr "Publicar" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "Cancelar" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -186,11 +215,30 @@ msgstr "Os comentários são moderados" msgid "comment_description_plain_text" msgstr "Você pode adicionar um comentário preenchendo o formulário a seguir. Campo de texto simples." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "Edição do comentário cancelada" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "Comentário foi editado" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" -msgstr "${creator} em ${content}" +msgstr "${author_name} em ${content}" + +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "Editar comentário" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "Editar cometário" #. Default: "Action" #: ../browser/moderation.pt:85 @@ -223,76 +271,81 @@ msgid "heading_moderate_comments" msgstr "Moderar comentários" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Se selecionado, usuários anonimos poderão adicionar comentários sem precisar de usuário e senha. É altamente recomendável a utilização de uma solução de captcha para evitar spam caso esta configuração esteja ativada." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "Caso selecionado, usuários anônimos devem informar um email." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Utilize esta opção para ativar ou desativar o Captcha para os comentários. Instale plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet ou collective.z3cform.norobots caso não tenha nenhuma opção disponível." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Algumas configurações relacionadas a comentários não estão localizadas no Painel de Controle de Comentários.\n" "Para habilitar comentários para um tipo de item específico, vá até a configuração de Tipos no Painel de Controle, encontre o tipo desejado e selecione \"Permitir comentários \".\n" "Para ativar o workflow de moderação de comentários, vá até a configuração de Tipos no Painel de Controle, escolha \"Comentário\" e selecione o workflow para \"Workflow de Revisão de Comentários\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "Caso selecionado, permite a edição e remoção de comentários por usuários com a permissão 'Editar comentários'" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Caso selecionado, permite que os visitantes adicionem comentários ao site. Porém, você deve habilitar comentários para cada tipo de conteúdo antes que os usuários possam adicionar comentários." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Caso selecionado, os comentários serão adicionados no estado \"Pendente\", que é invisível ao público. Usuários com permissão para 'Revisar Comentários' ('Revisor' ou 'Administrador') podem aprovar os comentários para torná-los visíveis ao público. Caso queira ativar um workflow de comentários personalizado, você deve ir até a Configuração dos Tipos no Painel de Controle." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Endereço para o qual as notificações do moderador serão enviadas." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" -msgstr "Se selecionado, o moderador será avisado quando um comentário precisar de atenção. O endereço de e-mail do moderador pode ser encontrado nas configurações de e-mail no Painel de Controle (campo Endereço de 'Remetente' do site)" +msgstr "Se selecionado, o moderador será avisado quando um comentário precisar de atenção. O endereço de e-mail do moderador pode ser definido abaixo." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Se selecionado, uma imagem do usuário será exibida próxima ao comentário." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Use esta configuração para escolher se o texto do comentário deve ser transformado. Você pode escolher entre 'texto puro' e 'texto inteligente'. 'Texto inteligente' converte texto simples em HTML, onde as quebras de linha e os recuos são preservados, e os endereços web e e-mail são transformados em links clicáveis." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Se selecionado, permite aos usuários solicitar o recebimento de avisos por e-mail sempre que hover um novo comentário." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anônimo" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Permitir comentários anônimos." #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "Habilitar campo de email para usuários anônimos" @@ -302,17 +355,17 @@ msgid "label_apply" msgstr "Aplicar" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Comentário" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Comentários foram desativados." @@ -321,13 +374,18 @@ msgstr "Comentários foram desativados." msgid "label_delete" msgstr "Excluir" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "Habilitar edição de comentários" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Ativar comentários globalmente" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Ativar moderação de comentários" @@ -347,12 +405,12 @@ msgid "label_publish" msgstr "Aprovar" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "disse:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Exibir imagem do autor" @@ -362,30 +420,39 @@ msgid "label_show_full_comment_text" msgstr "Exibir texto completo" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Assunto" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformações aplicadas ao texto do comentário" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Ativar notificação de e-mail para os usuários" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 -#, fuzzy +#: ../comment.py:59 msgid "mail_notification_message" -msgstr "Um comentário em '${title}' foi adicionado aqui: ${link}" +msgstr "Um comentário em '${title}' foi adicionado aqui: ${link}\n\n---\n{text}\n---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" -msgstr "Um comentário no conteúdo '${title}' foi adicionado em: ${link}\n\n---\n${text}\n---\n\Aprove o comentário:\n${link_approve}\n\nRemova o comentário:\n${link_delete}\n" +msgstr "" +"Um comentário no conteúdo '${title}' foi adicionado em: ${link}\n" +"\n" +"---\n" +"${text}\n" +"---\n" +"\Aprove o comentário:\n" +"${link_approve}\n" +"\n" +"Remova o comentário:\n" +"${link_delete}\n" #. Default: "enable the 'Comment Review Workflow' for the Comment content type" #: ../browser/moderation.pt:33 diff --git a/plone/app/discussion/locales/ro/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/ro/LC_MESSAGES/plone.app.discussion.po index e5ee778..77541a6 100644 --- a/plone/app/discussion/locales/ro/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/ro/LC_MESSAGES/plone.app.discussion.po @@ -15,11 +15,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Un comentariu a fost postat." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Un id de comentariu unic pentru aceasta conversatie" @@ -27,43 +27,67 @@ msgstr "Un id de comentariu unic pentru aceasta conversatie" msgid "Add a comment" msgstr "Adauga comentariu" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Comentarii de la anonimi" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Anuleaza" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Schimbari salvate" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Comentariul a fost aprobat." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Comentariul a fost sters." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Imaginea comentatorului" msgid "Commenting infrastructure for Plone" msgstr "Infrastructura de comentarii pentru Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Conversatie" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Data creerii" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -71,43 +95,43 @@ msgstr "" msgid "Disabled" msgstr "Dezactivat" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Setarile Discutiilor" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Editare anulata" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Email" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Permite Comentarii" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id-ul comentariului pentru care acest comentariu raspunde" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "Tip MIME" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Notificare Moderatorului prin Email" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Data modificarii" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Nume" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Anuntama de noi comentarii prin email." @@ -115,44 +139,44 @@ msgstr "Anuntama de noi comentarii prin email." msgid "Plone Discussions" msgstr "Discutii Plone" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Tip obiect" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Salveaza" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Setul comentatorilor unici (nume de utilizator)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Notificarea utilizatorului prin email" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Comentariul tau asteapta sa fie moderat." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Comentariu" @@ -166,6 +190,11 @@ msgstr "Sterge" msgid "bulkactions_publish" msgstr "Aproba" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -186,12 +215,32 @@ msgstr "Comentariile sunt moderate." msgid "comment_description_plain_text" msgstr "Poti adauga un comentariu prin completarea formularului de mai jos. Format de text simplu doar." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} al ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -223,76 +272,82 @@ msgid "heading_moderate_comments" msgstr "Modereaza comentarii" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Daca selectat, utilizatorii anonimi vor putea posta comentarii fara a fi autentificati. Este recomandat a se folosi o solutie captcha pentru a preveni spam-ul daca aceasta setare este activata." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Foloseste aceasta setare pentru a activa sau dezactiva validarea Captcha a comentariilor. Instaleaza plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet sau collective.z3cform.norobots daca nu este nici o optiune disponibila." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Unele setari legate de discutii nu sunt localizate in Panoul de Discutii.\n" "Pentru a activa comentarii pentru un tip specific de obiect, dute la Panoul de Control al Tipurilor pentru acest obiect si selecteaza \"Permite comentarii\".\n" "Pentru a alege workflow-ul de moderare pentru comentarii, dute la Panoul de Control pentru Tipuri de obiect, alege \"Comentariu\" si seteaza workflow-ul la \"Workflow de moderare al Comentariilor\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Daca selectat, utilizatorii pot posta comentarii in acest site. Totusi, trebuie sa activezi comentariile pentru tipurile de obiecte in mod specific, fie directoare sau alte tipurile de obiect inainte ca utilizatorii sa poata posta comentarii." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Daca selectat, comentariile vor intra intr-o stare de 'Asteptare' in care ele sunt invizibile publicului. Un utilizator cu permisia 'Modereaza Comentarii' ('Moderator' sau 'Manager') poate aprova comentariile pentru a le face vizibile publicului. Daca doresti sa activezi un workflow de comentariu specific, trebuie sa mergi la panoul de control al obiectelor" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Adresa de email la care notificarile de moderare vor fi trimise." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Daca selectat, moderatorul este notificat daca un comentariu are nevoie de atentie. Adresa de email al moderatorului poate fi gasita in panoul de control numit 'Setari mail' (Adresa 'De la' pentru Site)" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Daca selectat, o imagine al utilizatorului este afisata langa comentariul sau." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Foloseste aceasta setare pentru a alege daca textul comentariului ar trebui sa fie transformat intr-un fel. Poti alege intre 'Text simplu' si 'Text inteligent'. 'Text inteligent' transforma textul simplu in HTML unde indentarea si liniile sunt pastrate si adresele de email si web sunt transformate in link-uri." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Daca selectat, utilizatorii pot alege sa fie notificati de noi comentarii prin email." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonimi" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Permite comentariile anonime" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -302,17 +357,17 @@ msgid "label_apply" msgstr "Aplica" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Comentariu" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Comentariile au fost dezactivate." @@ -321,13 +376,18 @@ msgstr "Comentariile au fost dezactivate." msgid "label_delete" msgstr "Sterge" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Activeaza comentariile in mod global" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Activeaza moderarea comentariilor" @@ -347,12 +407,12 @@ msgid "label_publish" msgstr "Aproba" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "zice:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Arata imaginea comentatorului" @@ -362,22 +422,22 @@ msgid "label_show_full_comment_text" msgstr "Arata textul intreg al comentariului" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Subiect" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Transformarea textului comentariului" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Activeaza notificarea utilizatorului prin email" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Un comentariu pe '${title}' a fost postat aici: ${link}\n" @@ -387,7 +447,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Un comentariu pe '${title}' a fost postat aici: ${link}\n" diff --git a/plone/app/discussion/locales/sk/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/sk/LC_MESSAGES/plone.app.discussion.po index 78d6353..e8194d4 100644 --- a/plone/app/discussion/locales/sk/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/sk/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "" @@ -26,43 +26,67 @@ msgstr "" msgid "Add a comment" msgstr "" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "" msgid "Commenting infrastructure for Plone" msgstr "" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -70,43 +94,43 @@ msgstr "" msgid "Disabled" msgstr "" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "" @@ -114,44 +138,44 @@ msgstr "" msgid "Plone Discussions" msgstr "" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "" @@ -165,6 +189,11 @@ msgstr "" msgid "bulkactions_publish" msgstr "" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,11 +214,31 @@ msgstr "" msgid "comment_description_plain_text" msgstr "" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -221,73 +270,78 @@ msgid "heading_moderate_comments" msgstr "" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "" #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "" #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" msgstr "" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "" #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -297,17 +351,17 @@ msgid "label_apply" msgstr "" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "" @@ -316,13 +370,18 @@ msgstr "" msgid "label_delete" msgstr "" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "" @@ -342,12 +401,12 @@ msgid "label_publish" msgstr "" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "" @@ -357,27 +416,27 @@ msgid "label_show_full_comment_text" msgstr "" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" diff --git a/plone/app/discussion/locales/sv/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/sv/LC_MESSAGES/plone.app.discussion.po index 8ecb817..9b918cc 100644 --- a/plone/app/discussion/locales/sv/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/sv/LC_MESSAGES/plone.app.discussion.po @@ -15,12 +15,12 @@ msgstr "" "Domain: DOMAIN\n" "X-Is-Fallback-For: sv-fi sv-se\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "En kommentar har postats." # kommentarstråd? -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "En id unik för denna kommentar" @@ -28,43 +28,67 @@ msgstr "En id unik för denna kommentar" msgid "Add a comment" msgstr "Lägg till en kommentar" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Anonym kommentar" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Avbryt" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Ändringar sparade" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Kommentaren har nu godkänts." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Kommentaren har nu raderats." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Porträtt av kommentatorn" msgid "Commenting infrastructure for Plone" msgstr "Infrastruktur för kommentarer i Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Diskussion" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Skapelsedatum" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -72,43 +96,43 @@ msgstr "" msgid "Disabled" msgstr "Inaktiverad" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Inställningar för kommentarer" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Redigering avbruten" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-post" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Aktivera kommentarer" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id för den kommentar som denna kommentar besvarar" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Varsling av moderator på epostAvisering till moderatorn med e-post" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Ändringsdatum" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Namn" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Avisera mig om nya kommentarer med e-post." @@ -116,44 +140,44 @@ msgstr "Avisera mig om nya kommentarer med e-post." msgid "Plone Discussions" msgstr "Plone Discussions" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Portaltyp" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Spara" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Lista över kommentatorer (användarnamn)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Avisering till användare med e-post" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Din kommentar inväntar moderatorns godkännande." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Kommentera" @@ -167,6 +191,11 @@ msgstr "Radera" msgid "bulkactions_publish" msgstr "Godkänn" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -187,12 +216,32 @@ msgstr "Kommentaren visas när den godkänts av moderatorn." msgid "comment_description_plain_text" msgstr "Du kan lägga till en kommentar genom att fylla i fälten nedan." +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} om ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -224,76 +273,82 @@ msgid "heading_moderate_comments" msgstr "Moderera kommentarer" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Tillåt anonyma användare att kommentera utan att logga in. För att undvika skräppost, rekommenderas starkt att Captcha-validering aktiveras." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Aktivera captcha-validering av kommentarer. Om listrutan saknar alternativ: installera plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet eller collective.z3cform.norobots." # NOTE: "\n # does not work. #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "Vissa inställningar för kommentarer finns inte på denna kontrollpanel. — För att aktivera kommentarer för en viss innehållstyp, välj denna på kontrollpanelen \"Innehållstyper\" och markera rutan \"Tillåt kommentarer \". — För att aktivera ett arbetsflöde för moderation av kommentarer, välj \"Kommentar\" på kontrollpanelen \"Innehållstyper\" och sätt nytt arbetsflöde \"Comment Review Workflow\"." +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Ge användarna möjlighet att kommentera innehållsposter. Dessutom måste du aktivera kommentarer för berörda innehållstyper, mappar eller poster." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Nya kommentarer får arbetsflödesstatus \"Pending\", och blir inte publikt tillgängliga förrän de godkänns av en moderator. Moderatorn behöver behörigheten \"Review comments\", rollerna \"Reviewer\" och \"Manager\" har det som standard. — För att ge kommentarer ett anpassat arbetsflöde, använd kontrollpanelen \"Innehållstyper\"." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "E-postadress för aviseringar till moderatorn." # " The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" is FALSE! -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Avisera moderatorn med e-post när en ny kommentar behöver åtgärdas." #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Visa ett porträtt av kommentatorn bredvid kommentaren." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "\"Plain text\": Endast radbrytningar bevaras. — \"Intelligent text\": Konvertering till HTML; radbrytningar och indrag bevaras, webbadresser och e-postadresser blir klickbara länkar." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Ge inloggade användare möjlighet att välja att bli aviserade med e-post om nya kommentarer." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Anonym" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Tillåt anonyma kommentarer" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -303,17 +358,17 @@ msgid "label_apply" msgstr "Verkställ" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Kommentar" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Kommentarsfunktionen har inaktiverats." @@ -322,13 +377,18 @@ msgstr "Kommentarsfunktionen har inaktiverats." msgid "label_delete" msgstr "Radera" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Aktivera kommentarer globalt" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Aktivera moderation för kommentarer" @@ -348,12 +408,12 @@ msgid "label_publish" msgstr "Godkänn" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "säger:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Visa porträtt av kommentatorn" @@ -363,22 +423,22 @@ msgid "label_show_full_comment_text" msgstr "visa hela kommentaren" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Ämne" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Texttransformering för kommentarer" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Aktivera e-post-avisering till användare" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "En kommentar till '${title}' har postats här: ${link}\n" @@ -388,7 +448,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "En kommentar till '${title}' har postats här: ${link}\n" diff --git a/plone/app/discussion/locales/uk/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/uk/LC_MESSAGES/plone.app.discussion.po index 615f639..2605b9a 100644 --- a/plone/app/discussion/locales/uk/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/uk/LC_MESSAGES/plone.app.discussion.po @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: DOMAIN\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "Коментар додано." -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "Унікальний ідентифікатор коментаря для цієї розмови" @@ -26,43 +26,67 @@ msgstr "Унікальний ідентифікатор коментаря дл msgid "Add a comment" msgstr "Додати коментар" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "Анонімне коментування" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "Скасувати" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "Зміни збережено" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "Коментар опубліковано." -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "Коментар знищено." -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "Зображення коментатора" msgid "Commenting infrastructure for Plone" msgstr "Інфраструктура коментування в Plone" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "Розмова" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "Дата створення" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "Дата останного публічного коментаря" @@ -70,43 +94,43 @@ msgstr "Дата останного публічного коментаря" msgid "Disabled" msgstr "Вимкнено" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "Налаштуванняя коментування" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "Редагування скасовано" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Електронна адреса" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "Увімкнути можливість додавати коментарі" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "Id коментаря, відповіддю на який - є цей коментар" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-тип" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Сповіщення модератора електронною поштою" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "Дата зміни" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "Ім'я" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "Повідомляти про нові коментарі поштою." @@ -114,44 +138,44 @@ msgstr "Повідомляти про нові коментарі поштою." msgid "Plone Discussions" msgstr "Коментування в Plone" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Портал тип" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "Зберегти" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "Перелік коментаторів (імена користувачів)" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "Перелік коментаторів (імена користувачів) опублікованих коментарів" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "Загальна кількість публічних коментарів для даного елемента" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "Не доступне перетворення '%s' => '%s'. Не вдалося перетворити коментар '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "Не доступне перетворення '%s' => '%s'." -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Сповіщення користувача електронною поштою" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "Ім'я автора коментаря" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "Ваш коментар очікує затвердження модератором." #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "Коментар" @@ -165,6 +189,11 @@ msgstr "Знищити" msgid "bulkactions_publish" msgstr "Опублікувати" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -185,11 +214,31 @@ msgstr "Коментарі модеруються." msgid "comment_description_plain_text" msgstr "Ви можете додати коментар, заповнивши наступну форму. Просте форматування тексту. " +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 msgid "comment_title" msgstr "${author_name} до ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -221,76 +270,82 @@ msgid "heading_moderate_comments" msgstr "Модерування коментарів" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "Якщо вибрано - то анонімні користувачі зможуть додавати коментарі без входу в систему. Для таких випадків рекомендуєтсья використовувати капчу, щоб запобігти надсиланню спаму." #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "Якщо вибрано, анонімний користувач повинен буде вказати свою електронну пошту." #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "Використовуйте цей параметр, щоб увімкнути або вимкнути капчу для коментарів. Для цього спершу встановіть plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet або collective.z3cform.norobots." #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "Не всі налаштування коментувань знаходяться на цій сторінці.\n" "Так, щоб увімкнути можливість коментування для певного типу вмісту, перейдіть в розділ налаштувань Типи, виберіть необхідний тип вмісту, та виберіть \"Дозволити додавати коментар\".\n" "To enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\".\"" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "Якщо вибрано, користувачі зможуть додавати коментарі на сайт. Але спочатку необхідно увімкнути можливість коментування для певних типів вмісту, тек, об'єктів." #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "Якщо вибрано, коментарі увійде в стан 'В очікуванні', у якому вони невидимі для громадськості. Користувач з правом 'Огляд коментарів' ('Рецензент' або 'Менеджер') може схвалити коментар, щоб зробити їх видимими для громадськості. Якщо ви хочете налаштувати робочий процес коментарів, ви повинні піти в панель керування типів." #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "Адреса, за якою модератору будуть надсилатися повідомлення." -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "Якщо вибрано, модератор отримує повідомлення, якщо коментар вимагає уваги. Адресу електронної пошти модератора можна знайти в 'Пошта' панелі керування (Адреса 'Від')" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "Якщо вибрано, зображення коментатора буде відображатись поруч з коментарем." #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "Виберіть як повинен бути перетворений текст коментаря. Ви можете вибрати між 'Звичайний текст' і 'Інтелектуальні тексту'. 'Інтелектуальний текст' перетворює текст в HTML, де рядки і відступи зберігаються, інтернет адреси та адреси електронної пошти перетворяться в активні посилання." #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "Якщо вибрано, користувачі зможуть обрати можливість отримувати нотифікації про нові коментарі поштою." #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "Анонім" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "Увімкнути можливість анонімного коментування" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "Увімкнути поле електронної адреси для аноніма" @@ -300,17 +355,17 @@ msgid "label_apply" msgstr "Застосувати" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "Капча" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "Коментар" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "Коментування вимкнено" @@ -319,13 +374,18 @@ msgstr "Коментування вимкнено" msgid "label_delete" msgstr "Знищити" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "Увімкнути коментування для цілого сайту" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "Увімкнути модерування коментарів" @@ -345,12 +405,12 @@ msgid "label_publish" msgstr "Опублікувати" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "каже:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "Показати зображення коментатора" @@ -360,22 +420,22 @@ msgid "label_show_full_comment_text" msgstr "показати повний текст коментаря" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "Тема" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "Перетворення тексту коментаря" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "Увімкнути надcилання нотифікації користувачу через електронну адресу" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "Коментар до '${title}' було додано тут: ${link}\n" @@ -385,7 +445,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "Коментар до '${title}' було додано тут: ${link}\n" diff --git a/plone/app/discussion/locales/zh_CN/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/zh_CN/LC_MESSAGES/plone.app.discussion.po index f692907..beac55f 100644 --- a/plone/app/discussion/locales/zh_CN/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/zh_CN/LC_MESSAGES/plone.app.discussion.po @@ -16,11 +16,11 @@ msgstr "" "Preferred-Encodings: utf-8\n" "Domain: DOMAIN\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "一个评论已发布。" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "此对话的评论 ID" @@ -28,43 +28,67 @@ msgstr "此对话的评论 ID" msgid "Add a comment" msgstr "添加​​评论" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "匿名评论" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "取消" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "更改已保存" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "评论已批准。" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "评论已删除。" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "评论者头像" msgid "Commenting infrastructure for Plone" msgstr "Plone 的评论功能" -#: ../interfaces.py:136 +#: ../contentrules.py:51 +msgid "Comments" +msgstr "" + +#: ../interfaces.py:139 msgid "Conversation" msgstr "对话" -#: ../interfaces.py:167 +#: ../interfaces.py:177 msgid "Creation date" msgstr "创建日期" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" msgstr "" @@ -72,43 +96,43 @@ msgstr "" msgid "Disabled" msgstr "禁用" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "评论设置" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "编辑已取消" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "Email" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "启用评论" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "针对回复评论ID" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME 类型" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "Email 通知审核者" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "修改日期" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "名称" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "有新的评论,通过 Email 通知我" @@ -116,44 +140,44 @@ msgstr "有新的评论,通过 Email 通知我" msgid "Plone Discussions" msgstr "Plone 评论" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "Portal 类型" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "保存" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "评论者(用户名)的集合" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" msgstr "" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" msgstr "" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." msgstr "" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "Email 通知用户" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" msgstr "" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "您的评论正等待审核者的批准。" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "发表评论" @@ -167,6 +191,11 @@ msgstr "删除" msgid "bulkactions_publish" msgstr "批准" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -187,12 +216,32 @@ msgstr "评论将被审核。" msgid "comment_description_plain_text" msgstr "您可以通过填写以下表单发表评论,使用纯文本格式。" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 +#: ../comment.py:55 #, fuzzy msgid "comment_title" msgstr "${creator} 在 ${content}" +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" + #. Default: "Action" #: ../browser/moderation.pt:85 msgid "heading_action" @@ -224,76 +273,82 @@ msgid "heading_moderate_comments" msgstr "审核评论" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "如果选中,匿名用户可不登录的情况下发布评论。如果启用了此设置,强烈建议使用验证码,以防止垃圾评论。" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" msgstr "" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "设置启用或禁用评论验证码功能。如果没有任何可选项,可安装plone.formwidget.captcha,plone.formwidget.recaptcha,collective.akismet,或collective.z3cform.norobots。" #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "一些评论相关的设置并不位于 评论控制面板。\n" "要启用特定内容类型的评论,请到类型控制面板,选中这种类型的 \"允许评论\"。\n" "要启用评论审核工作流,请到类型控制面板,选择 \"评论\" 并将工作流设置为 \"评论审核工作流\"。" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "如果选中,用户可在网站上发表评论。不过,为使用户将能够发表评论,您还需要启用特定的内容类型、 文件夹或内容对象的发表评论功能。" #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "如果选中,评论将进入'待审核'状态,它们对用户是看不见的。'具有审核权限的用户('审核者'或'管理者')可以批准评论,使它们对用户可见。如果你要启用定制的评论工作流,你必须到类型控制面板。" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "审核通知发送地址。" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 +#, fuzzy msgid "help_moderator_notification_enabled" msgstr "如果选中,如评论需要注意,审核者将被通知。审核者的Email地址,可以在'邮件设置'控制面板(网站'发件人'地址)中找到。" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "如果选中,用户的头像显示在评论旁边。" #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "使用此设置选择评论文本的转换方式,你可以选择'纯文本'和'智能文本。'智能文本'转换纯文本成HTML格式,其中换行和缩进保留,Web和Email地址都转换为可点击链接。" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "如果选中,用户可以选择通过Email通知新的评论。" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "匿名" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "启用匿名评论" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" msgstr "" @@ -303,17 +358,17 @@ msgid "label_apply" msgstr "应用" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "验证码" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "评论" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "评论已被禁用。" @@ -322,13 +377,18 @@ msgstr "评论已被禁用。" msgid "label_delete" msgstr "删除" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "全局启用评论" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "启用评论审核" @@ -348,12 +408,12 @@ msgid "label_publish" msgstr "批准" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "说:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "显示评论者的头像" @@ -363,22 +423,22 @@ msgid "label_show_full_comment_text" msgstr "显示完整的评论文本" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "标题" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "评论文本转换" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "启用用户Email通知" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "一条评论 '${title}' 已发布在: ${link}\n" @@ -388,7 +448,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "一条评论 '${title}' 已发布在: ${link}\n" diff --git a/plone/app/discussion/locales/zh_TW/LC_MESSAGES/plone.app.discussion.po b/plone/app/discussion/locales/zh_TW/LC_MESSAGES/plone.app.discussion.po index 4f566ac..9061aea 100644 --- a/plone/app/discussion/locales/zh_TW/LC_MESSAGES/plone.app.discussion.po +++ b/plone/app/discussion/locales/zh_TW/LC_MESSAGES/plone.app.discussion.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: plone.app.discussion\n" "POT-Creation-Date: YEAR-MO-DA HO:MI +ZONE\n" -"PO-Revision-Date: 2012-10-09 20:55+0800\n" +"PO-Revision-Date: 2014-05-02 20:55+0800\n" "Last-Translator: TsungWei Hu \n" "Language-Team: Plone I18N \n" "MIME-Version: 1.0\n" @@ -14,11 +14,11 @@ msgstr "" "Preferred-Encodings: utf-8 latin1\n" "Domain: plone.app.discussion\n" -#: ../comment.py:311 +#: ../comment.py:357 msgid "A comment has been posted." msgstr "留言已張貼。" -#: ../interfaces.py:141 +#: ../interfaces.py:144 msgid "A comment id unique to this conversation" msgstr "留言的識別碼" @@ -26,87 +26,111 @@ msgstr "留言的識別碼" msgid "Add a comment" msgstr "新增留言" -#: ../browser/controlpanel.py:64 +#: ../browser/controlpanel.py:75 msgid "Anonymous Comments" msgstr "匿名留言" -#: ../browser/comments.py:251 -#: ../browser/controlpanel.py:82 +#: ../browser/comments.py:274 +#: ../browser/controlpanel.py:93 msgid "Cancel" msgstr "取消" -#: ../browser/controlpanel.py:78 +#: ../browser/controlpanel.py:89 msgid "Changes saved" msgstr "變更已儲存" -#: ../browser/moderation.py:140 +#: ../browser/moderation.py:154 msgid "Comment approved." msgstr "留言已審核" -#: ../browser/moderation.py:100 +#: ../contentrules.py:96 +msgid "Comment author email" +msgstr "留言作者電郵" + +#: ../contentrules.py:85 +msgid "Comment author full name" +msgstr "留言作者姓名" + +#: ../contentrules.py:74 +msgid "Comment author user name" +msgstr "留言作者帳號" + +#: ../browser/moderation.py:108 msgid "Comment deleted." msgstr "留言已刪除" -#: ../browser/controlpanel.py:65 +#: ../contentrules.py:52 +msgid "Comment id" +msgstr "留言識別碼" + +#: ../contentrules.py:63 +msgid "Comment text" +msgstr "留言內文" + +#: ../browser/controlpanel.py:76 msgid "Commenter Image" msgstr "留言者圖檔" msgid "Commenting infrastructure for Plone" msgstr "Plone 的留言功能" -#: ../interfaces.py:136 -msgid "Conversation" -msgstr "討論" +#: ../contentrules.py:51 +msgid "Comments" +msgstr "留言" -#: ../interfaces.py:167 +#: ../interfaces.py:139 +msgid "Conversation" +msgstr "留言功能" + +#: ../interfaces.py:177 msgid "Creation date" msgstr "建立日期" -#: ../interfaces.py:40 +#: ../interfaces.py:41 msgid "Date of the most recent public comment" -msgstr "" +msgstr "最新留言的日期" #: ../vocabularies.py:44 msgid "Disabled" msgstr "已停用" -#: ../browser/controlpanel.py:34 +#: ../browser/controlpanel.py:35 msgid "Discussion settings" msgstr "討論區設定" -#: ../browser/controlpanel.py:84 +#: ../browser/controlpanel.py:95 msgid "Edit cancelled" msgstr "取消編輯" -#: ../interfaces.py:153 +#: ../interfaces.py:156 msgid "Email" msgstr "E-Mail" -#: ../browser/controlpanel.py:63 +#: ../browser/controlpanel.py:74 msgid "Enable Comments" msgstr "允許留言" -#: ../interfaces.py:144 +#: ../interfaces.py:147 msgid "Id of comment this comment is in reply to" msgstr "留言的識別碼" -#: ../interfaces.py:158 +#: ../interfaces.py:161 msgid "MIME type" msgstr "MIME-Type" -#: ../browser/controlpanel.py:67 +#: ../browser/controlpanel.py:78 msgid "Moderator Email Notification" msgstr "審核者的電子郵件通知" -#: ../interfaces.py:168 +#: ../interfaces.py:178 msgid "Modification date" msgstr "修改日期" -#: ../interfaces.py:138 +#: ../interfaces.py:141 msgid "Name" msgstr "名稱" -#: ../interfaces.py:162 +#: ../interfaces.py:170 msgid "Notify me of new comments via email." msgstr "寄送電郵通知新留言。" @@ -114,44 +138,44 @@ msgstr "寄送電郵通知新留言。" msgid "Plone Discussions" msgstr "Plone 討論區" -#: ../interfaces.py:131 +#: ../interfaces.py:134 msgid "Portal type" msgstr "網站型別" -#: ../browser/controlpanel.py:71 +#: ../browser/controlpanel.py:82 msgid "Save" msgstr "儲存" -#: ../interfaces.py:45 +#: ../interfaces.py:46 msgid "The set of unique commentators (usernames)" msgstr "留言者 (使用者名稱) 的集合" -#: ../interfaces.py:50 +#: ../interfaces.py:51 msgid "The set of unique commentators (usernames) of published_comments" -msgstr "" +msgstr "留言的帳號列表" -#: ../interfaces.py:34 +#: ../interfaces.py:35 msgid "Total number of public comments on this item" -msgstr "" +msgstr "留言的數量統計" -#: ../comment.py:158 -msgid "Transform '%s' => '%s' not available. Failed to transform comment '%s'." -msgstr "" +#: ../comment.py:173 +msgid "Transform '%s' => '%s' not available." +msgstr "轉換 '%s' => '%s' 並不存在" -#: ../browser/controlpanel.py:69 +#: ../browser/controlpanel.py:80 msgid "User Email Notification" msgstr "新留言通知使用者" -#: ../interfaces.py:166 +#: ../interfaces.py:176 msgid "Username of the commenter" -msgstr "" +msgstr "留言者的帳號" -#: ../browser/comments.py:244 +#: ../browser/comments.py:267 msgid "Your comment awaits moderator approval." msgstr "你的留言等待審核中。" #. Default: "Comment" -#: ../browser/comments.py:131 +#: ../browser/comments.py:138 msgid "add_comment_button" msgstr "留言" @@ -165,6 +189,11 @@ msgstr "刪除" msgid "bulkactions_publish" msgstr "審核" +#. Default: "Cancel" +#: ../browser/comment.py:97 +msgid "cancel_form_button" +msgstr "" + #. Default: "You can add a comment by filling out the form below. Plain text formatting. Web and email addresses are transformed into clickable links." #: ../browser/comments.py:57 msgid "comment_description_intelligent_text" @@ -173,7 +202,7 @@ msgstr "填寫下列表單後,就可以新增留言。網址會被轉換成可 #. Default: "You can add a comment by filling out the form below. Plain text formatting. You can use the Markdown syntax for links and images." #: ../browser/comments.py:51 msgid "comment_description_markdown" -msgstr "" +msgstr "填寫表單後可以留言,可以套用 Markdown 語法來輸入連結或圖檔。" #. Default: "Comments are moderated." #: ../browser/comments.py:63 @@ -185,11 +214,30 @@ msgstr "留言等待審核中" msgid "comment_description_plain_text" msgstr "填寫下列表單後,就可以新增留言。" +#. Default: "Edit comment cancelled" +#: ../browser/comment.py:101 +msgid "comment_edit_cancel_notification" +msgstr "" + +#. Default: "Comment was edited" +#: ../browser/comment.py:91 +msgid "comment_edit_notification" +msgstr "" + #. Default: "${author_name} on ${content}" -#: ../comment.py:48 -#, fuzzy +#: ../comment.py:55 msgid "comment_title" -msgstr "${creator} 在 ${content} 留言" +msgstr "${author_name} 在 ${content} 留言" + +#. Default: "Edit comment" +#: ../browser/comment.py:70 +msgid "edit_comment_form_button" +msgstr "" + +#. Default: "Edit comment" +#: ../browser/comment.py:54 +msgid "edit_comment_form_title" +msgstr "" #. Default: "Action" #: ../browser/moderation.pt:85 @@ -222,78 +270,83 @@ msgid "heading_moderate_comments" msgstr "審核留言" #. Default: "If selected, anonymous users are able to post comments without loggin in. It is highly recommended to use a captcha solution to prevent spam if this setting is enabled." -#: ../interfaces.py:236 +#: ../interfaces.py:216 msgid "help_anonymous_comments" msgstr "勾選的話,匿名使用者不必登入系統就能留言。建議使用 captcha 來避免垃圾留言。" #. Default: "If selected, anonymous user will have to give their email." -#: ../interfaces.py:334 +#: ../interfaces.py:341 msgid "help_anonymous_email_enabled" -msgstr "" +msgstr "勾選的話,匿名留言者必須填寫電郵信箱。" #. Default: "Use this setting to enable or disable Captcha validation for comments. Install plone.formwidget.captcha, plone.formwidget.recaptcha, collective.akismet, or collective.z3cform.norobots if there are no options available." -#: ../interfaces.py:279 +#: ../interfaces.py:277 msgid "help_captcha" msgstr "設定留言是否啟用或停用 captcha 功能,如果還沒有這類模組選項的話,可安裝 plone.formwidget.captcha、plone.formwidget.recaptcha、collective.akismet 或 collective.z3cform.norobots。" #. Default: "Some discussion related settings are not located in the Discussion Control Panel.\nTo enable comments for a specific content type, go to the Types Control Panel of this type and choose \"Allow comments\".\nTo enable the moderation workflow for comments, go to the Types Control Panel, choose \"Comment\" and set workflow to \"Comment Review Workflow\"." -#: ../browser/controlpanel.py:35 +#: ../browser/controlpanel.py:36 msgid "help_discussion_settings_editform" msgstr "" "某些討論區設定值並未在討論區控制面板找得到。\n" "想要指定某個內容型別的留言功能,請到型別控制面板,指定「允許留言」。\n" "想要指定留言的審核流程,請到型別控制面板,點選「留言」並指定工作流程為「留言審核流程」。" +#. Default: "If selected, supports editing and deletion of comments for users with the 'Edit comments' permission." +#: ../interfaces.py:249 +msgid "help_edit_comment_enabled" +msgstr "" + #. Default: "If selected, users are able to post comments on the site. Though, you have to enable comments for specific content types, folders or content objects before users will be able to post comments." -#: ../interfaces.py:224 +#: ../interfaces.py:202 msgid "help_globally_enabled" msgstr "勾選的話,就啟用使用者的留言功能,不過,仍然要決定哪些內容型別、目錄、項目,能讓使用者留言。" #. Default: "If selected, comments will enter a 'Pending' state in which they are invisible to the public. A user with the 'Review comments' permission ('Reviewer' or 'Manager') can approve comments to make them visible to the public. If you want to enable a custom comment workflow, you have to go to the types control panel." -#: ../interfaces.py:248 +#: ../interfaces.py:232 msgid "help_moderation_enabled" msgstr "勾選的話,留言會先變成待審狀態,直到通過審核後才會公開,想要客製化管理流程的話,必須到型別設定頁面。" #. Default: "Address to which moderator notifications will be sent." -#: ../interfaces.py:316 +#: ../interfaces.py:318 msgid "help_moderator_email" msgstr "審核通知信的寄送地址。" -#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be found in the 'Mail settings' control panel (Site 'From' address)" +#. Default: "If selected, the moderator is notified if a comment needs attention. The moderator email address can be set below." #: ../interfaces.py:304 msgid "help_moderator_notification_enabled" -msgstr "勾選的話,有人留言時就會通知審核者。審核者的寄信地址記錄在郵件設定頁面裡。" +msgstr "勾選的話,有人留言時就會通知審核者。審核者的寄信地址可在下列欄位設定。" #. Default: "If selected, an image of the user is shown next to the comment." -#: ../interfaces.py:294 +#: ../interfaces.py:293 msgid "help_show_commenter_image" msgstr "勾選的話,使用者的圖檔會顯示在留言旁邊。" #. Default: "Use this setting to choose if the comment text should be transformed in any way. You can choose between 'Plain text' and 'Intelligent text'. 'Intelligent text' converts plain text into HTML where line breaks and indentation is preserved, and web and email addresses are made into clickable links." -#: ../interfaces.py:263 +#: ../interfaces.py:260 msgid "help_text_transform" msgstr "選擇留言的標註格式,選擇「排版文字」的話,會主動保留內容的換行和縮排,也會把網址變成可以點選的連結。" #. Default: "If selected, users can choose to be notified of new comments by email." -#: ../interfaces.py:325 +#: ../interfaces.py:330 msgid "help_user_notification_enabled" msgstr "勾選的話,使用者可以收到新留言的通知信。" #. Default: "Anonymous" -#: ../browser/comments.pt:71 -#: ../comment.py:173 +#: ../browser/comments.pt:74 +#: ../comment.py:191 msgid "label_anonymous" msgstr "無名氏" #. Default: "Enable anonymous comments" -#: ../interfaces.py:234 +#: ../interfaces.py:214 msgid "label_anonymous_comments" msgstr "啟用匿名留言功能" #. Default: "Enable anonymous email field" -#: ../interfaces.py:332 +#: ../interfaces.py:339 msgid "label_anonymous_email_enabled" -msgstr "" +msgstr "啟用匿名留言的電郵欄位" #. Default: "Apply" #: ../browser/moderation.pt:71 @@ -301,17 +354,17 @@ msgid "label_apply" msgstr "更新" #. Default: "Captcha" -#: ../interfaces.py:277 +#: ../interfaces.py:275 msgid "label_captcha" msgstr "captcha" #. Default: "Comment" -#: ../interfaces.py:159 +#: ../interfaces.py:163 msgid "label_comment" msgstr "留言" #. Default: "Commenting has been disabled." -#: ../browser/comments.pt:130 +#: ../browser/comments.pt:148 msgid "label_commenting_disabled" msgstr "留言功能已停用。" @@ -320,13 +373,18 @@ msgstr "留言功能已停用。" msgid "label_delete" msgstr "刪除" +#. Default: "Enable editing of comments" +#: ../interfaces.py:247 +msgid "label_edit_comment_enabled" +msgstr "" + #. Default: "Globally enable comments" -#: ../interfaces.py:222 +#: ../interfaces.py:200 msgid "label_globally_enabled" msgstr "全域啟用留言功能" #. Default: "Enable comment moderation" -#: ../interfaces.py:246 +#: ../interfaces.py:228 msgid "label_moderation_enabled" msgstr "啟用審核功能" @@ -346,12 +404,12 @@ msgid "label_publish" msgstr "審核" #. Default: "says:" -#: ../browser/comments.pt:74 +#: ../browser/comments.pt:77 msgid "label_says" msgstr "留言:" #. Default: "Show commenter image" -#: ../interfaces.py:292 +#: ../interfaces.py:291 msgid "label_show_commenter_image" msgstr "顯示留言者圖檔" @@ -361,22 +419,22 @@ msgid "label_show_full_comment_text" msgstr "顯示完整的留言內容" #. Default: "Subject" -#: ../interfaces.py:155 +#: ../interfaces.py:158 msgid "label_subject" msgstr "標題" #. Default: "Comment text transform" -#: ../interfaces.py:261 +#: ../interfaces.py:258 msgid "label_text_transform" msgstr "留言排版格式" #. Default: "Enable user email notification" -#: ../interfaces.py:323 +#: ../interfaces.py:326 msgid "label_user_notification_enabled" msgstr "啟用通知使用者的功能" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n" -#: ../comment.py:52 +#: ../comment.py:59 msgid "mail_notification_message" msgstr "" "${title} 有新留言:${link}\n" @@ -386,7 +444,7 @@ msgstr "" "---\n" #. Default: "A comment on '${title}' has been posted here: ${link}\n\n---\n${text}\n---\n\nApprove comment:\n${link_approve}\n\nDelete comment:\n${link_delete}\n" -#: ../comment.py:60 +#: ../comment.py:67 msgid "mail_notification_message_moderator" msgstr "" "${title} 有新留言:${link}\n" diff --git a/plone/app/discussion/patches.py b/plone/app/discussion/patches.py index f803f10..9491702 100644 --- a/plone/app/discussion/patches.py +++ b/plone/app/discussion/patches.py @@ -1,7 +1,5 @@ from Products.CMFCore.utils import getToolByName -from zope.component import queryUtility - from Acquisition import aq_inner, aq_parent from zope.annotation.interfaces import IAnnotations diff --git a/plone/app/discussion/permissions.zcml b/plone/app/discussion/permissions.zcml index c5b090c..66aa050 100644 --- a/plone/app/discussion/permissions.zcml +++ b/plone/app/discussion/permissions.zcml @@ -9,4 +9,19 @@ title="Review comments" /> + + + + + + diff --git a/plone/app/discussion/profiles/default/metadata.xml b/plone/app/discussion/profiles/default/metadata.xml index ffedb11..ce1f445 100644 --- a/plone/app/discussion/profiles/default/metadata.xml +++ b/plone/app/discussion/profiles/default/metadata.xml @@ -1,5 +1,5 @@ - 100 + 102 profile-plone.app.registry:default diff --git a/plone/app/discussion/profiles/default/registry.xml b/plone/app/discussion/profiles/default/registry.xml index fd2a894..bd6aa5b 100644 --- a/plone/app/discussion/profiles/default/registry.xml +++ b/plone/app/discussion/profiles/default/registry.xml @@ -1,4 +1,7 @@ - - \ No newline at end of file + + False + False + + diff --git a/plone/app/discussion/profiles/default/rolemap.xml b/plone/app/discussion/profiles/default/rolemap.xml index 83318d8..0410b29 100644 --- a/plone/app/discussion/profiles/default/rolemap.xml +++ b/plone/app/discussion/profiles/default/rolemap.xml @@ -3,11 +3,28 @@ - + + + + + + + + + + + + + + + + + + diff --git a/plone/app/discussion/subscribers.py b/plone/app/discussion/subscribers.py index 20ac7ad..07e0bb5 100644 --- a/plone/app/discussion/subscribers.py +++ b/plone/app/discussion/subscribers.py @@ -1,14 +1,15 @@ from Products.CMFCore.utils import getToolByName + def index_object(obj, event): """Index the object when it is added to the conversation. """ catalog = getToolByName(obj, 'portal_catalog') return catalog.reindexObject(obj) + def unindex_object(obj, event): """Unindex the object when it is removed from the conversation. """ catalog = getToolByName(obj, 'portal_catalog') return catalog.unindexObject(obj) - diff --git a/plone/app/discussion/subscribers.zcml b/plone/app/discussion/subscribers.zcml index e563f80..12a30a5 100644 --- a/plone/app/discussion/subscribers.zcml +++ b/plone/app/discussion/subscribers.zcml @@ -15,12 +15,24 @@ handler=".comment.notify_content_object" /> + + + + >> unprivileged_browser = Browser(app) >>> browser_member = Browser(app) >>> browser_user = Browser(app) + >>> browser_reviewer = Browser(app) Make sure we have a test user from the layer and it uses fancy characters: @@ -143,7 +144,6 @@ Post a comment as member ------------------------ Login as user 'jim'. - >>> browser_member.open(portal_url + '/login_form') >>> browser_member.getControl(name='__ac_name').value = 'jim' >>> browser_member.getControl(name='__ac_password').value = 'secret' @@ -250,6 +250,173 @@ Check that the reply has been posted properly. True +Edit an existing comment +------------------------ + +Log in as admin + + >>> browser.getLink('Log out').click() + >>> browser.open(portal_url + '/login_form') + >>> browser.getControl('Login Name').value = 'admin' + >>> browser.getControl('Password').value = 'secret' + >>> browser.getControl('Log in').click() + +Use the Plone control panel to enable comment editing. + + >>> browser.open(portal_url + '/plone_control_panel') + >>> browser.getLink('Discussion').click() + >>> browser.getControl('Enable editing of comments').selected = True + >>> browser.getControl(name='form.buttons.save').click() + +Extract the edit comment url from the first "edit comment" button + + >>> browser.open(urldoc1) + >>> form = browser.getForm(name='edit', index=0) + >>> '@@edit-comment' in form.action + True + +Open the edit comment view + + >>> browser.open(form.action) + >>> ctrl = browser.getControl('Comment') + >>> ctrl.value + 'Comment from admin' + +Change and save the comment + + >>> ctrl.value = 'Comment from admin / was edited' + >>> browser.getControl('Edit comment').click() + +This used to trigger permissions problems in some portlet configurations. +Check it ain't so. + + >>> 'require_login' in browser.url + False + >>> browser.url.startswith('http://nohost/plone/doc1') + True + >>> 'Comment from admin / was edited' in browser.contents + True + +Opening the edit comment view, then cancel, does nothing. + + >>> form = browser.getForm(name='edit', index=0) + >>> '@@edit-comment' in form.action + True + >>> browser.open(form.action) + >>> browser.getControl('Cancel').click() + >>> browser.url.startswith('http://nohost/plone/doc1') + True + + +Anon cannot edit comments. + + >>> unprivileged_browser.open(urldoc1) + >>> '@@edit-comments' in browser.contents + False + +But Anon can see the edited comment. + + >>> 'Comment from admin / was edited' in unprivileged_browser.contents + True + + +Deleting existing comments | 'Delete comments' permission +---------------------------------------------------------- + +Anonymous cannot delete comments + + >>> unprivileged_browser.open(urldoc1) + >>> 'form.button.Delete' in unprivileged_browser.contents + False + +A member cannot delete his own comments if he can't review or he isn't a Site Administrator + + >>> browser_member.open(urldoc1) + >>> 'form.button.Delete' in browser_member.contents + False + +Admin can delete comments + + >>> browser.open(urldoc1) + >>> 'form.button.Delete' in browser.contents + True + +Extract the delete comment url from the first "delete comment" button + + >>> browser.open(urldoc1) + >>> form = browser.getForm(name='delete', index=0) + >>> delete_url = form.action + >>> '@@moderate-delete-comment' in delete_url + True + >>> comment_id = delete_url.split('/')[-2] + +Anonymous cannot delete a comment by hitting the delete url directly. + + >>> unprivileged_browser.open(delete_url) + +The comment is still there + + >>> unprivileged_browser.open(urldoc1) + >>> comment_id in unprivileged_browser.contents + True + +A Member cannot delete even his own comment by hitting the delete url directly. + +Extract the member comment id from the admin browser + + >>> form = browser.getForm(name='delete', index=2) + >>> delete_url = form.action + >>> '@@moderate-delete-comment' in delete_url + True + >>> comment_id = delete_url.split('/')[-2] + +Now try to hit that url as the member owning that comment. +Work around some possible testbrowser breakage and check the result later. + + >>> try: + ... browser_member.open(delete_url) + ... except: + ... pass + +The comment is still there + + >>> browser_member.open(urldoc1) + >>> comment_id in browser_member.contents + True + >>> 'Comment from Jim' in browser_member.contents + True + +Now login as user 'reviewer' + + >>> browser_reviewer.open(portal_url + '/login_form') + >>> browser_reviewer.getControl(name='__ac_name').value = 'reviewer' + >>> browser_reviewer.getControl(name='__ac_password').value = 'secret' + >>> browser_reviewer.getControl(name='submit').click() + +Admin and who have 'Delete comments' permission (reviewers for example), can delete comments + + >>> browser_reviewer.open(urldoc1) + >>> form = browser_reviewer.getForm(name='delete', index=0) + >>> '@@moderate-delete-comment' in form.action + True + + >>> comment_id = form.action.split('/')[-2] + +Submitting the form runs into a testbrowser notFoundException. +We'll just catch that and check the result later. + + >>> try: + ... form.submit() + ... except: + ... pass + +Returning to the document we find the deleted comment is indeed gone + + >>> browser_reviewer.open(urldoc1) + >>> comment_id in browser_reviewer.contents + False + + Post a comment with comment review workflow enabled --------------------------------------------------- @@ -299,7 +466,7 @@ Login as admin. Edit the content object. >>> browser.open("http://nohost/plone/doc1/edit") - >>> browser.getControl(name='form.widgets.text').value = "Lorem ipsum" + >>> browser.getControl(name='form.widgets.IRichText.text').value = "Lorem ipsum" >>> browser.getControl('Save').click() Make sure the edit was successful. diff --git a/plone/app/discussion/tests/javascripts/README.txt b/plone/app/discussion/tests/javascripts/README.txt deleted file mode 100644 index b01287f..0000000 --- a/plone/app/discussion/tests/javascripts/README.txt +++ /dev/null @@ -1,41 +0,0 @@ -plone.app.discussion javascript testsuite -========================================= - -Note: This document was shamelessly stolen from the plone.app.deco package. - -We're using QUnit_ for unit testing, the jQuery test runner. - -Simply load index.html directly in the browser with a file:/// url; not via -Plone. This way our tests are truely standalone and isolated. - -Coverage testing ----------------- - -To test code coverage, I can heartily recommend using JSCoverage_. You can -download, compile and install it by: - - $ wget http://siliconforks.com/jscoverage/download/jscoverage-0.5.tar.bz2 - $ tar xfvj jscoverage-0.5.tar.bz2 - $ cd jscoverage-0.5 - $ ./configure - $ make - $ sudo make install - -After that, issue the following command to run it from your Plone buildout: - - $ jscoverage-server -v --ip-address=0.0.0.0 --port=8080 --encoding=UTF-8 \ - --document-root=plone/app/discussion/ --no-instrument=/tests - -Then point your browser to the now running `coverage server -`__, and -the test suite will run instrumented in an iframe. Select the Summary tab to see -the results. - -The command-line options ensure that only our tests and the modules being -tested are instrumented for coverage, not the testing framework nor jQuery. - -Note that JSCoverage adds instrumentation statements to the code, so don't try -to debug your tests when running via the jscoverage server. - -.. _QUnit: http://docs.jquery.com/QUnit -.. _JSCoverage: http://siliconforks.com/jscoverage/ diff --git a/plone/app/discussion/tests/javascripts/jquery.js b/plone/app/discussion/tests/javascripts/jquery.js deleted file mode 100644 index 7c24308..0000000 --- a/plone/app/discussion/tests/javascripts/jquery.js +++ /dev/null @@ -1,154 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.2 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Sat Feb 13 22:33:48 2010 -0500 - */ -(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, -Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& -(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, -a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== -"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, -function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; -var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, -parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= -false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= -s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, -applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; -else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, -a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== -w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, -cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, -function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); -k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), -C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= -e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& -f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; -if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", -e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, -"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, -d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); -t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| -g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, -CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, -g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, -text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, -setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= -h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== -"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, -h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& -q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; -if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); -(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: -function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= -{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== -"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", -d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? -a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== -1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, -""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); -return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", -""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= -c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? -c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= -function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= -Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, -"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= -a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= -a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== -"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, -serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), -function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, -global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& -e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? -"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== -false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= -false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", -c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| -d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); -g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== -1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== -"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; -if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== -"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| -c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; -this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= -this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, -e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; -a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); -c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, -d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- -f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": -"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in -e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/plone/app/discussion/tests/javascripts/test_comments.html b/plone/app/discussion/tests/javascripts/test_comments.html deleted file mode 100644 index be846e0..0000000 --- a/plone/app/discussion/tests/javascripts/test_comments.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - plone.app.discussion comments Test Suite - - - - - - - - - - - - - - - - - -

plone.app.discussion comments Test - Suite

- -

- -
-
- -

- -
    -
- - - - diff --git a/plone/app/discussion/tests/javascripts/test_comments.js b/plone/app/discussion/tests/javascripts/test_comments.js deleted file mode 100644 index 8bca11f..0000000 --- a/plone/app/discussion/tests/javascripts/test_comments.js +++ /dev/null @@ -1,146 +0,0 @@ - -$(document).ready(function () { - - /* TEST SETUP */ - - module("comments", { - setup: function () { - - // Create a comments section with one comment inside - // - //
- //
- //
- //

Lorem ipsum.

- //
- //
- // - //
- //
- //
- - var comments = $(document.createElement("div")) - .addClass("discussion") - .append($(document.createElement("div")) - .addClass("comment") - .attr("id", "1282720906349675") - .append($(document.createElement("div")) - .addClass("commentBody") - .append($(document.createElement("p")) - .text("Lorem ipsum.") - ) - ) - .append($(document.createElement("div")) - .addClass("commentActions") - .append($(document.createElement("button")) - .addClass("reply-to-comment-button") - )) - ); - $(document.body).append(comments); - - // Create a basic commenting form - // - // - //
- // - //
- //
- // - //
- //
- // - //
- //
- // - // - //
- // - - var commentform = $(document.createElement("div")) - .append($(document.createElement("form")) - .addClass("form") - .append($(document.createElement("div")) - .addClass("formfield-form-widgets-in_reply_to") - .append($(document.createElement("input")) - .attr("name", "form.widgets.in_reply_to") - .val("") - ) - ) - .append($(document.createElement("div")) - .addClass("formfield-form-widgets-author_name") - .append($(document.createElement("input")) - .attr("name", "form.widgets.author") - .attr("type", "text") - ) - ) - .append($(document.createElement("div")) - .addClass("formfield-form-widgets-text") - .append($(document.createElement("textarea")) - .attr("name", "form.widgets.text") - ) - ) - .append($(document.createElement("div")) - .addClass("formControls") - .append($(document.createElement("input")) - .attr("name", "form.buttons.comment")) - .append($(document.createElement("input")) - .attr("name", "form.buttons.cancel")) - ) - ) - .addClass("reply") - .attr("id", "commenting"); - $(document.body).append(commentform); - }, - teardown: function () { - $("#commenting").remove(); - $(".discussion").remove(); - } - }); - - - /* TESTS */ - - test("Hide the reply and the cancel button for the comment form", function(){ - expect(1); - $(".reply").find("input[name='form.buttons.cancel']").css("display", "none"); - equals($("input[name='form.buttons.cancel']").css("display"), "none", "The cancel button should be hidden"); - }); - - test("Show the reply button only when Javascript is enabled", function(){ - expect(1); - $(".reply-to-comment-button").css("display", "inline"); - equals($("button[class='reply-to-comment-button']").attr("style"), "display: inline;", "The reply button should show up when Javascript is enabled"); - }); - - test("Create a comment reply form.", function() { - expect(2); - var comment_div = $("#1282720906349675"); - var reply_button = comment_div.children(".reply-to-comment-button"); - $.createReplyForm(comment_div); - var reply_form = comment_div.children(".reply"); - ok(reply_form.find("input[name='form.widgets.in_reply_to']"), "Reply form has been copied"); - same(reply_form.find("input[name='form.widgets.in_reply_to']").val(), "1282720906349675", "The reply for should have the id of the comment in the in_reply_to field"); - }); - - test("Clear all form values from a form.", function() { - // Create a reply form with some values - var comment_div = $("#1282720906349675"); - $.createReplyForm(comment_div); - var reply_form = comment_div.find(".reply"); - var author = reply_form.find("input[name='form.widgets.author']"); - var text = comment_div.find("input[name='form.widgets.text']"); - author.val("my author"); - text.val("my text"); - // Call the clearForm function to clear the form - $.clearForm(comment_div); - // Check if all form fields have been cleared - var author = comment_div.find("input[name='form.widgets.author']"); - var text = comment_div.find("input[name='form.widgets.text']"); - equals(author.val(), "", "The author form value should be empty"); - equals(text.text(), "", "The text form value should be empty"); - - }); - -}); - - diff --git a/plone/app/discussion/tests/javascripts/test_moderation.html.txt b/plone/app/discussion/tests/javascripts/test_moderation.html.txt deleted file mode 100644 index 36afc81..0000000 --- a/plone/app/discussion/tests/javascripts/test_moderation.html.txt +++ /dev/null @@ -1,40 +0,0 @@ - - - - - plone.app.discussion moderation Test Suite - - - - - - - - - - - - - - - - - - -

plone.app.discussion moderation Test Suite

- -

- -
- -

- -
    - - - - diff --git a/plone/app/discussion/tests/javascripts/test_moderation.js.txt b/plone/app/discussion/tests/javascripts/test_moderation.js.txt deleted file mode 100644 index 49755d0..0000000 --- a/plone/app/discussion/tests/javascripts/test_moderation.js.txt +++ /dev/null @@ -1,72 +0,0 @@ -/* TEST SETUP */ - -module("comments", { - setup: function () { - //
    - // - // - // - // - // - // - // - //
    - // My comment - // - // - // - //
    - //
    - var review_table = $(document.createElement("form")) - .append($(document.createElement("table")) - .attr("id", "review-comments") - .append($(document.createElement("tbody")) - .append($(document.createElement("tr")) - .append($(document.createElement("td")) - .append($(document.createElement("a")) - .text("My comment.") - .attr("href", "http://localhost:8080/Plone/front-page/++conversation++default/1285339036601284") - ) - ) - .append($(document.createElement("td")) - .append($(document.createElement("input")) - .attr("id", "1285339036601284") - .attr("value", "Publish") - .attr("name", "form.button.Publish") - ) - .append($(document.createElement("input")) - .attr("id", "1285339036601284") - .attr("value", "Delete") - .attr("name", "form.button.Delete") - ) - .addClass("actions") - ) - ) - ) - ); - $(document.body).append(review_table); - }, - teardown: function () { - $("form").remove(); - } -}); - - -/* TESTS */ - -test("Delete a single comment", function(){ - expect(1); - stop(); - var delete_button = $(".actions").children("input[name='form.button.Delete']"); - delete_button.trigger('click'); - start(); - equals($("#1285339036601284").attr("name", "form.button.Delete").length, 0, "The comment row should have been deleted."); -}); - - -test("Publish a single comment", function(){ - expect(1); - var publish_button = $(".actions").children("input[name='form.button.Publish']"); - publish_button.trigger('click'); - equals($("#1285339036601284").attr("name", "form.button.Publish").length, 0, "The comment row should have been removed since the comment has been published."); -}); diff --git a/plone/app/discussion/tests/jsTestDriver.conf b/plone/app/discussion/tests/jsTestDriver.conf deleted file mode 100644 index c5335fb..0000000 --- a/plone/app/discussion/tests/jsTestDriver.conf +++ /dev/null @@ -1,18 +0,0 @@ -server: http://localhost:9876 - -load: - # Add these lines to load the equiv function and adapter in order, before the - # tests (assuming they are saved to tests/qunit/) - - qunit/equiv.js - - qunit/QUnitAdapter.js - - # This is where we load the qunit tests - - javascripts/*.js - - # And this loads the source files we are testing - - ../browser/javascripts/*.js - -plugin: - - name: "coverage" - jar: "../../../../parts/jstestdriver/coverage.jar" - module: "com.google.jstestdriver.coverage.CoverageModule" diff --git a/plone/app/discussion/tests/jsTestDriver.txt b/plone/app/discussion/tests/jsTestDriver.txt deleted file mode 100644 index 7751bb8..0000000 --- a/plone/app/discussion/tests/jsTestDriver.txt +++ /dev/null @@ -1,5 +0,0 @@ -============== -JS TEST DRIVER -============== - -java -jar JsTestDriver.jar --port 9876 --config jsTestDriver.conf --browser /usr/bin/firefox --tests all \ No newline at end of file diff --git a/plone/app/discussion/tests/qunit/QUnitAdapter.js b/plone/app/discussion/tests/qunit/QUnitAdapter.js deleted file mode 100644 index a3fc18c..0000000 --- a/plone/app/discussion/tests/qunit/QUnitAdapter.js +++ /dev/null @@ -1,85 +0,0 @@ -/* -QUnitAdapter -Version: 1.1.0 - -Run qunit tests using JS Test Driver - -This provides almost the same api as qunit. - -Tests must run sychronously, which means no use of stop and start methods. -You can use jsUnit Clock object to deal with timeouts and intervals: -http://googletesting.blogspot.com/2007/03/javascript-simulating-time-in-jsunit.html - -The qunit #main DOM element is not included. If you need to do any DOM manipulation -you need to set it up and tear it down in each test. - -*/ -(function() { - - if(!(window.equiv)) { - throw new Error("QUnitAdapter.js - Unable to find equiv function. Ensure you have added equiv.js to the load section of your jsTestDriver.conf"); - } - - var QUnitTestCase; - - window.module = function(name, lifecycle) { - QUnitTestCase = TestCase(name); - QUnitTestCase.prototype.lifecycle = lifecycle || {}; - }; - - window.test = function(name, expected, test) { - QUnitTestCase.prototype['test ' + name] = function() { - if(this.lifecycle.setup) { - this.lifecycle.setup(); - } - if(expected.constructor === Number) { - expectAsserts(expected); - } else { - test = expected; - } - test.call(this.lifecycle); - - if(this.lifecycle.teardown) { - this.lifecycle.teardown(); - } - }; - }; - - window.expect = function(count) { - expectAsserts(count); - }; - - window.ok = function(actual, msg) { - assertTrue(msg ? msg : '', !!actual); - }; - - window.equals = function(a, b, msg) { - assertEqual(msg ? msg : '', b, a); - }; - - window.start = window.stop = function() { - fail('start and stop methods are not available when using JS Test Driver.\n' + - 'Use jsUnit Clock object to deal with timeouts and intervals:\n' + - 'http://googletesting.blogspot.com/2007/03/javascript-simulating-time-in-jsunit.html.'); - }; - - window.same = function(a, b, msg) { - assertTrue(msg ? msg : '', window.equiv(b, a)); - }; - - window.reset = function() { - fail('reset method is not available when using JS Test Driver'); - }; - - window.isLocal = function() { - return false; - }; - - window.QUnit = { - equiv: window.equiv, - ok: window.ok - }; - - module('Default Module'); - -})(); diff --git a/plone/app/discussion/tests/qunit/equiv.js b/plone/app/discussion/tests/qunit/equiv.js deleted file mode 100644 index 2f5b9f3..0000000 --- a/plone/app/discussion/tests/qunit/equiv.js +++ /dev/null @@ -1,185 +0,0 @@ - -// Tests for equality any JavaScript type and structure without unexpected results. -// Discussions and reference: http://philrathe.com/articles/equiv -// Test suites: http://philrathe.com/tests/equiv -// Author: Philippe Rath -window.equiv = function () { - - var innerEquiv; // the real equiv function - var callers = []; // stack to decide between skip/abort functions - - // Determine what is o. - function hoozit(o) { - if (typeof o === "string") { - return "string"; - - } else if (typeof o === "boolean") { - return "boolean"; - - } else if (typeof o === "number") { - - if (isNaN(o)) { - return "nan"; - } else { - return "number"; - } - - } else if (typeof o === "undefined") { - return "undefined"; - - // consider: typeof null === object - } else if (o === null) { - return "null"; - - // consider: typeof [] === object - } else if (o instanceof Array) { - return "array"; - - // consider: typeof new Date() === object - } else if (o instanceof Date) { - return "date"; - - // consider: /./ instanceof Object; - // /./ instanceof RegExp; - // typeof /./ === "function"; // => false in IE and Opera, - // true in FF and Safari - } else if (o instanceof RegExp) { - return "regexp"; - - } else if (typeof o === "object") { - return "object"; - - } else if (o instanceof Function) { - return "function"; - } - } - - // Call the o related callback with the given arguments. - function bindCallbacks(o, callbacks, args) { - var prop = hoozit(o); - if (prop) { - if (hoozit(callbacks[prop]) === "function") { - return callbacks[prop].apply(callbacks, args); - } else { - return callbacks[prop]; // or undefined - } - } - } - - var callbacks = function () { - - // for string, boolean, number and null - function useStrictEquality(b, a) { - return a === b; - } - - return { - "string": useStrictEquality, - "boolean": useStrictEquality, - "number": useStrictEquality, - "null": useStrictEquality, - "undefined": useStrictEquality, - - "nan": function (b) { - return isNaN(b); - }, - - "date": function (b, a) { - return hoozit(b) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp": function (b, a) { - return hoozit(b) === "regexp" && - a.source === b.source && // the regex itself - a.global === b.global && // and its modifers (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function": function () { - var caller = callers[callers.length - 1]; - return caller !== Object && - typeof caller !== "undefined"; - }, - - "array": function (b, a) { - var i; - var len; - - // b could be an object literal here - if ( ! (hoozit(b) === "array")) { - return false; - } - - len = a.length; - if (len !== b.length) { // safe and faster - return false; - } - for (i = 0; i < len; i++) { - if( ! innerEquiv(a[i], b[i])) { - return false; - } - } - return true; - }, - - "object": function (b, a) { - var i; - var eq = true; // unless we can proove it - var aProperties = [], bProperties = []; // collection of strings - - // comparing constructors is more strict than using instanceof - if ( a.constructor !== b.constructor) { - return false; - } - - // stack constructor before traversing properties - callers.push(a.constructor); - - for (i in a) { // be strict: don't ensures hasOwnProperty and go deep - - aProperties.push(i); // collect a's properties - - if ( ! innerEquiv(a[i], b[i])) { - eq = false; - } - } - - callers.pop(); // unstack, we are done - - for (i in b) { - bProperties.push(i); // collect b's properties - } - - // Ensures identical properties name - return eq && innerEquiv(aProperties.sort(), bProperties.sort()); - } - }; - }(); - - innerEquiv = function () { // can take multiple arguments - var args = Array.prototype.slice.apply(arguments); - if (args.length < 2) { - return true; // end transition - } - - return (function (a, b) { - if (a === b) { - return true; // catch the most you can - - } else if (typeof a !== typeof b || a === null || b === null || typeof a === "undefined" || typeof b === "undefined") { - return false; // don't lose time with error prone cases - - } else { - return bindCallbacks(a, callbacks, [b, a]); - } - - // apply transition with (1..n) arguments - })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); - }; - - return innerEquiv; -}(); // equiv diff --git a/plone/app/discussion/tests/qunit/qunit.css b/plone/app/discussion/tests/qunit/qunit.css deleted file mode 100644 index 4542933..0000000 --- a/plone/app/discussion/tests/qunit/qunit.css +++ /dev/null @@ -1,17 +0,0 @@ -h1#qunit-header { padding: 15px; font-size: large; background-color: #06b; color: white; font-family: 'trebuchet ms', verdana, arial; margin: 0; } -h1#qunit-header a { color: white; } - -h2#qunit-banner { height: 2em; border-bottom: 1px solid white; background-color: #eee; margin: 0; font-family: 'trebuchet ms', verdana, arial; } -h2#qunit-banner.pass { background-color: green; } -h2#qunit-banner.fail { background-color: red; } - -h2#qunit-userAgent { padding: 10px; background-color: #eee; color: black; margin: 0; font-size: small; font-weight: normal; font-family: 'trebuchet ms', verdana, arial; font-size: 10pt; } - -div#qunit-testrunner-toolbar { background: #eee; border-top: 1px solid black; padding: 10px; font-family: 'trebuchet ms', verdana, arial; margin: 0; font-size: 10pt; } - -ol#qunit-tests { font-family: 'trebuchet ms', verdana, arial; font-size: 10pt; } -ol#qunit-tests li strong { cursor:pointer; } -ol#qunit-tests .pass { color: green; } -ol#qunit-tests .fail { color: red; } - -p#qunit-testresult { margin-left: 1em; font-size: 10pt; font-family: 'trebuchet ms', verdana, arial; } diff --git a/plone/app/discussion/tests/qunit/qunit.js b/plone/app/discussion/tests/qunit/qunit.js deleted file mode 100644 index 51ec655..0000000 --- a/plone/app/discussion/tests/qunit/qunit.js +++ /dev/null @@ -1,997 +0,0 @@ -/* - * QUnit - A JavaScript Unit Testing Framework - * - * http://docs.jquery.com/QUnit - * - * Copyright (c) 2009 John Resig, Jörn Zaefferer - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - */ - -(function(window) { - -var QUnit = { - - // Initialize the configuration options - init: function init() { - config = { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date, - blocking: false, - autorun: false, - assertions: [], - filters: [], - queue: [] - }; - - var tests = id("qunit-tests"), - banner = id("qunit-banner"), - result = id("qunit-testresult"); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - }, - - // call on start of module test to prepend name to all tests - module: function module(name, testEnvironment) { - - synchronize(function() { - if ( config.currentModule ) { - QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); - } - - config.currentModule = name; - config.moduleTestEnvironment = testEnvironment; - config.moduleStats = { all: 0, bad: 0 }; - - QUnit.moduleStart( name, testEnvironment ); - }); - }, - - asyncTest: function asyncTest(testName, expected, callback) { - if ( arguments.length === 2 ) { - callback = expected; - expected = 0; - } - - QUnit.test(testName, expected, callback, true); - }, - - test: function test(testName, expected, callback, async) { - var name = testName, testEnvironment = {}; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - name = config.currentModule + " module: " + name; - } - - if ( !validTest(name) ) { - return; - } - - synchronize(function() { - QUnit.testStart( testName ); - - testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, config.moduleTestEnvironment); - - config.assertions = []; - config.expected = null; - - if ( arguments.length >= 3 ) { - config.expected = callback; - callback = arguments[2]; - } - - try { - if ( !config.pollution ) { - saveGlobal(); - } - - testEnvironment.setup.call(testEnvironment); - } catch(e) { - QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); - } - - if ( async ) { - QUnit.stop(); - } - - try { - callback.call(testEnvironment); - } catch(e) { - fail("Test " + name + " died, exception and test follows", e, callback); - QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - start(); - } - } - }); - - synchronize(function() { - try { - checkPollution(); - testEnvironment.teardown.call(testEnvironment); - } catch(e) { - QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); - } - - try { - QUnit.reset(); - } catch(e) { - fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); - } - - if ( config.expected && config.expected != config.assertions.length ) { - QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); - } - - var good = 0, bad = 0, - tests = id("qunit-tests"); - - config.stats.all += config.assertions.length; - config.moduleStats.all += config.assertions.length; - - if ( tests ) { - var ol = document.createElement("ol"); - ol.style.display = "none"; - - for ( var i = 0; i < config.assertions.length; i++ ) { - var assertion = config.assertions[i]; - - var li = document.createElement("li"); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || "(no message)"; - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - var b = document.createElement("strong"); - b.innerHTML = name + " (" + bad + ", " + good + ", " + config.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.nextSibling, display = next.style.display; - next.style.display = display === "none" ? "block" : "none"; - }); - - addEvent(b, "dblclick", function(e) { - var target = (e || window.event).target; - if ( target.nodeName.toLowerCase() === "strong" ) { - var text = "", node = target.firstChild; - - while ( node.nodeType === 3 ) { - text += node.nodeValue; - node = node.nextSibling; - } - - text = text.replace(/(^\s*|\s*$)/g, ""); - - if ( window.location ) { - window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text); - } - } - }); - - var li = document.createElement("li"); - li.className = bad ? "fail" : "pass"; - li.appendChild( b ); - li.appendChild( ol ); - tests.appendChild( li ); - - if ( bad ) { - var toolbar = id("qunit-testrunner-toolbar"); - if ( toolbar ) { - toolbar.style.display = "block"; - id("qunit-filter-pass").disabled = null; - id("qunit-filter-missing").disabled = null; - } - } - - } else { - for ( var i = 0; i < config.assertions.length; i++ ) { - if ( !config.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - QUnit.testDone( testName, bad, config.assertions.length ); - - if ( !window.setTimeout && !config.queue.length ) { - done(); - } - }); - - if ( window.setTimeout && !config.doneTimer ) { - config.doneTimer = window.setTimeout(function(){ - if ( !config.queue.length ) { - done(); - } else { - synchronize( done ); - } - }, 13); - } - }, - - /** - * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. - */ - expect: function expect(asserts) { - config.expected = asserts; - }, - - /** - * Asserts true. - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function ok(a, msg) { - QUnit.log(a, msg); - - config.assertions.push({ - result: !!a, - message: msg - }); - }, - - /** - * Checks that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * - * Prefered to ok( actual == expected, message ) - * - * @example equals( format("Received {0} bytes.", 2), "Received 2 bytes." ); - * - * @param Object actual - * @param Object expected - * @param String message (optional) - */ - equals: function equals(actual, expected, message) { - push(expected == actual, actual, expected, message); - }, - - same: function(a, b, message) { - push(QUnit.equiv(a, b), a, b, message); - }, - - start: function start() { - // A slight delay, to avoid any current callbacks - if ( window.setTimeout ) { - window.setTimeout(function() { - if ( config.timeout ) { - clearTimeout(config.timeout); - } - - config.blocking = false; - process(); - }, 13); - } else { - config.blocking = false; - process(); - } - }, - - stop: function stop(timeout) { - config.blocking = true; - - if ( timeout && window.setTimeout ) { - config.timeout = window.setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - QUnit.start(); - }, timeout); - } - }, - - /** - * Resets the test setup. Useful for tests that modify the DOM. - */ - reset: function reset() { - if ( window.jQuery ) { - jQuery("#main").html( config.fixture ); - jQuery.event.global = {}; - jQuery.ajaxSettings = extend({}, config.ajaxSettings); - } - }, - - /** - * Trigger an event on an element. - * - * @example triggerEvent( document.body, "click" ); - * - * @param DOMElement elem - * @param String type - */ - triggerEvent: function triggerEvent( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent("MouseEvents"); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - elem.dispatchEvent( event ); - - } else if ( elem.fireEvent ) { - elem.fireEvent("on"+type); - } - }, - - // Logging callbacks - done: function done(failures, total) {}, - log: function log(result, message) {}, - testStart: function testStart(name) {}, - testDone: function testDone(name, failures, total) {}, - moduleStart: function moduleStart(name, testEnvironment) {}, - moduleDone: function moduleDone(name, failures, total) {} -}; - -// Maintain internal state -var config = { - // The queue of tests to run - queue: [], - - // block until document ready - blocking: true -}; - -// Load paramaters -(function() { - var location = window.location || { search: "", protocol: "file:" }, - GETParams = location.search.slice(1).split('&'); - - for ( var i = 0; i < GETParams.length; i++ ) { - GETParams[i] = decodeURIComponent( GETParams[i] ); - if ( GETParams[i] === "noglobals" ) { - GETParams.splice( i, 1 ); - i--; - config.noglobals = true; - } - } - - // restrict modules/tests by get parameters - config.filters = GETParams; - - // Figure out if we're running the tests from a server or not - QUnit.isLocal = !!(location.protocol === 'file:'); -})(); - -// Expose the API as global variables, unless an 'exports' -// object exists, in that case we assume we're in CommonJS -if ( typeof exports === "undefined" || typeof require === "undefined" ) { - extend(window, QUnit); - window.QUnit = QUnit; -} else { - extend(exports, QUnit); - exports.QUnit = QUnit; -} - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -addEvent(window, "load", function() { - // Initialize the config, saving the execution queue - var oldconfig = extend({}, config); - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - var userAgent = id("qunit-userAgent"); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - - var toolbar = id("qunit-testrunner-toolbar"); - if ( toolbar ) { - toolbar.style.display = "none"; - - var filter = document.createElement("input"); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - filter.disabled = true; - addEvent( filter, "click", function() { - var li = document.getElementsByTagName("li"); - for ( var i = 0; i < li.length; i++ ) { - if ( li[i].className.indexOf("pass") > -1 ) { - li[i].style.display = filter.checked ? "none" : "block"; - } - } - }); - toolbar.appendChild( filter ); - - var label = document.createElement("label"); - label.setAttribute("for", "filter-pass"); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - var missing = document.createElement("input"); - missing.type = "checkbox"; - missing.id = "qunit-filter-missing"; - missing.disabled = true; - addEvent( missing, "click", function() { - var li = document.getElementsByTagName("li"); - for ( var i = 0; i < li.length; i++ ) { - if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { - li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; - } - } - }); - toolbar.appendChild( missing ); - - label = document.createElement("label"); - label.setAttribute("for", "filter-missing"); - label.innerHTML = "Hide missing tests (untested code is broken code)"; - toolbar.appendChild( label ); - } - - var main = id('main'); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( window.jQuery ) { - config.ajaxSettings = window.jQuery.ajaxSettings; - } - - QUnit.start(); -}); - -function done() { - if ( config.doneTimer && window.clearTimeout ) { - window.clearTimeout( config.doneTimer ); - config.doneTimer = null; - } - - if ( config.queue.length ) { - config.doneTimer = window.setTimeout(function(){ - if ( !config.queue.length ) { - done(); - } else { - synchronize( done ); - } - }, 13); - - return; - } - - config.autorun = true; - - // Log the last module results - if ( config.currentModule ) { - QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); - } - - var banner = id("qunit-banner"), - tests = id("qunit-tests"), - html = ['Tests completed in ', - +new Date - config.started, ' milliseconds.
    ', - '', config.stats.all - config.stats.bad, ' tests of ', config.stats.all, ' passed, ', config.stats.bad,' failed.'].join(''); - - if ( banner ) { - banner.className += " " + (config.stats.bad ? "fail" : "pass"); - } - - if ( tests ) { - var result = id("qunit-testresult"); - - if ( !result ) { - result = document.createElement("p"); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests.nextSibling ); - } - - result.innerHTML = html; - } - - QUnit.done( config.stats.bad, config.stats.all ); -} - -function validTest( name ) { - var i = config.filters.length, - run = false; - - if ( !i ) { - return true; - } - - while ( i-- ) { - var filter = config.filters[i], - not = filter.charAt(0) == '!'; - - if ( not ) { - filter = filter.slice(1); - } - - if ( name.indexOf(filter) !== -1 ) { - return !not; - } - - if ( not ) { - run = true; - } - } - - return run; -} - -function push(result, actual, expected, message) { - message = message || (result ? "okay" : "failed"); - QUnit.ok( result, result ? message + ": " + expected : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) ); -} - -function synchronize( callback ) { - config.queue.push( callback ); - - if ( config.autorun && !config.blocking ) { - process(); - } -} - -function process() { - while ( config.queue.length && !config.blocking ) { - config.queue.shift()(); - } -} - -function saveGlobal() { - config.pollution = []; - - if ( config.noglobals ) { - for ( var key in window ) { - config.pollution.push( key ); - } - } -} - -function checkPollution( name ) { - var old = config.pollution; - saveGlobal(); - - var newGlobals = diff( old, config.pollution ); - if ( newGlobals.length > 0 ) { - ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); - config.expected++; - } - - var deletedGlobals = diff( config.pollution, old ); - if ( deletedGlobals.length > 0 ) { - ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); - config.expected++; - } -} - -// returns a new Array with the elements that are in a but not in b -function diff( a, b ) { - var result = a.slice(); - for ( var i = 0; i < result.length; i++ ) { - for ( var j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { - result.splice(i, 1); - i--; - break; - } - } - } - return result; -} - -function fail(message, exception, callback) { - if ( typeof console !== "undefined" && console.error && console.warn ) { - console.error(message); - console.error(exception); - console.warn(callback.toString()); - - } else if ( window.opera && opera.postError ) { - opera.postError(message, exception, callback.toString); - } -} - -function extend(a, b) { - for ( var prop in b ) { - a[prop] = b[prop]; - } - - return a; -} - -function addEvent(elem, type, fn) { - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, fn ); - } else { - fn(); - } -} - -function id(name) { - return !!(typeof document !== "undefined" && document && document.getElementById) && - document.getElementById( name ); -} - -// Test for equality any JavaScript type. -// Discussions and reference: http://philrathe.com/articles/equiv -// Test suites: http://philrathe.com/tests/equiv -// Author: Philippe Rathé -QUnit.equiv = function () { - - var innerEquiv; // the real equiv function - var callers = []; // stack to decide between skip/abort functions - - - // Determine what is o. - function hoozit(o) { - if (o.constructor === String) { - return "string"; - - } else if (o.constructor === Boolean) { - return "boolean"; - - } else if (o.constructor === Number) { - - if (isNaN(o)) { - return "nan"; - } else { - return "number"; - } - - } else if (typeof o === "undefined") { - return "undefined"; - - // consider: typeof null === object - } else if (o === null) { - return "null"; - - // consider: typeof [] === object - } else if (o instanceof Array) { - return "array"; - - // consider: typeof new Date() === object - } else if (o instanceof Date) { - return "date"; - - // consider: /./ instanceof Object; - // /./ instanceof RegExp; - // typeof /./ === "function"; // => false in IE and Opera, - // true in FF and Safari - } else if (o instanceof RegExp) { - return "regexp"; - - } else if (typeof o === "object") { - return "object"; - - } else if (o instanceof Function) { - return "function"; - } else { - return undefined; - } - } - - // Call the o related callback with the given arguments. - function bindCallbacks(o, callbacks, args) { - var prop = hoozit(o); - if (prop) { - if (hoozit(callbacks[prop]) === "function") { - return callbacks[prop].apply(callbacks, args); - } else { - return callbacks[prop]; // or undefined - } - } - } - - var callbacks = function () { - - // for string, boolean, number and null - function useStrictEquality(b, a) { - if (b instanceof a.constructor || a instanceof b.constructor) { - // to catch short annotaion VS 'new' annotation of a declaration - // e.g. var i = 1; - // var j = new Number(1); - return a == b; - } else { - return a === b; - } - } - - return { - "string": useStrictEquality, - "boolean": useStrictEquality, - "number": useStrictEquality, - "null": useStrictEquality, - "undefined": useStrictEquality, - - "nan": function (b) { - return isNaN(b); - }, - - "date": function (b, a) { - return hoozit(b) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp": function (b, a) { - return hoozit(b) === "regexp" && - a.source === b.source && // the regex itself - a.global === b.global && // and its modifers (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function": function () { - var caller = callers[callers.length - 1]; - return caller !== Object && - typeof caller !== "undefined"; - }, - - "array": function (b, a) { - var i; - var len; - - // b could be an object literal here - if ( ! (hoozit(b) === "array")) { - return false; - } - - len = a.length; - if (len !== b.length) { // safe and faster - return false; - } - for (i = 0; i < len; i++) { - if ( ! innerEquiv(a[i], b[i])) { - return false; - } - } - return true; - }, - - "object": function (b, a) { - var i; - var eq = true; // unless we can proove it - var aProperties = [], bProperties = []; // collection of strings - - // comparing constructors is more strict than using instanceof - if ( a.constructor !== b.constructor) { - return false; - } - - // stack constructor before traversing properties - callers.push(a.constructor); - - for (i in a) { // be strict: don't ensures hasOwnProperty and go deep - - aProperties.push(i); // collect a's properties - - if ( ! innerEquiv(a[i], b[i])) { - eq = false; - } - } - - callers.pop(); // unstack, we are done - - for (i in b) { - bProperties.push(i); // collect b's properties - } - - // Ensures identical properties name - return eq && innerEquiv(aProperties.sort(), bProperties.sort()); - } - }; - }(); - - innerEquiv = function () { // can take multiple arguments - var args = Array.prototype.slice.apply(arguments); - if (args.length < 2) { - return true; // end transition - } - - return (function (a, b) { - if (a === b) { - return true; // catch the most you can - } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) { - return false; // don't lose time with error prone cases - } else { - return bindCallbacks(a, callbacks, [b, a]); - } - - // apply transition with (1..n) arguments - })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); - }; - - return innerEquiv; - -}(); - -/** - * jsDump - * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com - * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) - * Date: 5/15/2008 - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { - function quote( str ) { - return '"' + str.toString().replace(/"/g, '\\"') + '"'; - }; - function literal( o ) { - return o + ''; - }; - function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); - if ( arr.join ) - arr = arr.join( ',' + s + inner ); - if ( !arr ) - return pre + post; - return [ pre, inner + arr, base + post ].join(s); - }; - function array( arr ) { - var i = arr.length, ret = Array(i); - this.up(); - while ( i-- ) - ret[i] = this.parse( arr[i] ); - this.down(); - return join( '[', ret, ']' ); - }; - - var reName = /^function (\w+)/; - - var jsDump = { - parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance - var parser = this.parsers[ type || this.typeOf(obj) ]; - type = typeof parser; - - return type == 'function' ? parser.call( this, obj ) : - type == 'string' ? parser : - this.parsers.error; - }, - typeOf:function( obj ) { - var type = typeof obj, - f = 'function';//we'll use it 3 times, save it - return type != 'object' && type != f ? type : - !obj ? 'null' : - obj.exec ? 'regexp' :// some browsers (FF) consider regexps functions - obj.getHours ? 'date' : - obj.scrollBy ? 'window' : - obj.nodeName == '#document' ? 'document' : - obj.nodeName ? 'node' : - obj.item ? 'nodelist' : // Safari reports nodelists as functions - obj.callee ? 'arguments' : - obj.call || obj.constructor != Array && //an array would also fall on this hack - (obj+'').indexOf(f) != -1 ? f : //IE reports functions like alert, as objects - 'length' in obj ? 'array' : - type; - }, - separator:function() { - return this.multiline ? this.HTML ? '
    ' : '\n' : this.HTML ? ' ' : ' '; - }, - indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing - if ( !this.multiline ) - return ''; - var chr = this.indentChar; - if ( this.HTML ) - chr = chr.replace(/\t/g,' ').replace(/ /g,' '); - return Array( this._depth_ + (extra||0) ).join(chr); - }, - up:function( a ) { - this._depth_ += a || 1; - }, - down:function( a ) { - this._depth_ -= a || 1; - }, - setParser:function( name, parser ) { - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote:quote, - literal:literal, - join:join, - // - _depth_: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers:{ - window: '[Window]', - document: '[Document]', - error:'[ERROR]', //when no parser is found, shouldn't happen - unknown: '[Unknown]', - 'null':'null', - undefined:'undefined', - 'function':function( fn ) { - var ret = 'function', - name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE - if ( name ) - ret += ' ' + name; - ret += '('; - - ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); - return join( ret, this.parse(fn,'functionCode'), '}' ); - }, - array: array, - nodelist: array, - arguments: array, - object:function( map ) { - var ret = [ ]; - this.up(); - for ( var key in map ) - ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); - this.down(); - return join( '{', ret, '}' ); - }, - node:function( node ) { - var open = this.HTML ? '<' : '<', - close = this.HTML ? '>' : '>'; - - var tag = node.nodeName.toLowerCase(), - ret = open + tag; - - for ( var a in this.DOMAttrs ) { - var val = node[this.DOMAttrs[a]]; - if ( val ) - ret += ' ' + a + '=' + this.parse( val, 'attribute' ); - } - return ret + close + open + '/' + tag + close; - }, - functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function - var l = fn.length; - if ( !l ) return ''; - - var args = Array(l); - while ( l-- ) - args[l] = String.fromCharCode(97+l);//97 is 'a' - return ' ' + args.join(', ') + ' '; - }, - key:quote, //object calls it internally, the key part of an item in a map - functionCode:'[code]', //function calls it internally, it's the content of the function - attribute:quote, //node calls it internally, it's an html attribute value - string:quote, - date:quote, - regexp:literal, //regex - number:literal, - 'boolean':literal - }, - DOMAttrs:{//attributes to dump from nodes, name=>realName - id:'id', - name:'name', - 'class':'className' - }, - HTML:true,//if true, entities are escaped ( <, >, \t, space and \n ) - indentChar:' ',//indentation unit - multiline:true //if true, items in a collection, are separated by a \n, else just a space. - }; - - return jsDump; -})(); - -})(this); diff --git a/plone/app/discussion/tests/robot/test_discussion.robot b/plone/app/discussion/tests/robot/test_discussion.robot new file mode 100644 index 0000000..a4e56e1 --- /dev/null +++ b/plone/app/discussion/tests/robot/test_discussion.robot @@ -0,0 +1,84 @@ +# ============================================================================ +# Test basic discussion features (adding, replying, deleting) +# ============================================================================ +# +# $ bin/robot-server plone.app.discussion.testing.PLONE_APP_DISCUSSION_ROBOT_TESTING +# $ bin/robot src/plone.app.discussion/src/plone/app/discussion/tests/robot/test_discussion.robot +# +# ============================================================================ + +*** Settings *** + +Resource plone/app/robotframework/selenium.robot + +Library Remote ${PLONE_URL}/RobotRemote + +Test Setup Open test browser +Test Teardown Close all browsers + + +*** Test Cases *** + +Enable Discussion on a Document + Given a logged-in Site Administrator + and a document + When I enable discussion on the document + Then I can see a comment form on the document + +Add Comment to a Document + Given a logged-in Site Administrator + and a document with discussion enabled + When I add a comment + Then I can see the comment below the document + +#Reply to a comment on a Document +# Given a logged-in Site Administrator +# and a document with discussion enabled + +#Delete Comment from a Document +# Given a logged-in Site Administrator +# and a document with discussion enabled + + +*** Keywords *** + +# Given + +a logged-in Site Administrator + Enable autologin as Site Administrator + +a document + Create content type=Document id=my-document title=My Document + +a document with discussion enabled + a document + I enable discussion on the document + + +# When + +I enable discussion on the document + Go To ${PLONE_URL}/my-document/edit + Wait until page contains Settings + Click Link Settings + Wait until element is visible name=form.widgets.IAllowDiscussion.allow_discussion:list + Select From List name=form.widgets.IAllowDiscussion.allow_discussion:list True + Click Button Save + +I add a comment + Wait until page contains element id=form-widgets-comment-text + Input Text id=form-widgets-comment-text This is a comment + Click Button Comment + + +# Then + +I can see a comment form on the document + Go To ${PLONE_URL}/my-document/view + Wait until page contains My Document + Page should contain Add comment + Page should contain element id=form-widgets-comment-text + +I can see the comment below the document + Go To ${PLONE_URL}/my-document/view + Page should contain This is a comment diff --git a/plone/app/discussion/tests/test_catalog.py b/plone/app/discussion/tests/test_catalog.py index 1560ad2..9003648 100644 --- a/plone/app/discussion/tests/test_catalog.py +++ b/plone/app/discussion/tests/test_catalog.py @@ -19,8 +19,6 @@ from plone.app.discussion.testing import ( from plone.app.discussion.interfaces import IConversation -from plone.app.discussion.testing import COLLECTION_TYPE - class CatalogSetupTest(unittest.TestCase): @@ -48,6 +46,8 @@ class CatalogSetupTest(unittest.TestCase): ) def test_collection_criteria_installed(self): + if 'portal_atct' not in self.portal: + return try: self.portal.portal_atct.getIndex('commentators') self.portal.portal_atct.getIndex('total_comments') @@ -532,31 +532,6 @@ class CommentCatalogTest(unittest.TestCase): self.assertTrue(brains) self.assertEqual(len(brains), 6) - def test_collection(self): - if COLLECTION_TYPE == "Topic": - self.portal.invokeFactory('Topic', id='topic') - topic = self.portal.topic - crit = topic.addCriterion('Type', 'ATSimpleStringCriterion') - crit.setValue('Comment') - query = topic.buildQuery() - - self.assertEqual(len(query), 1) - self.assertEqual(query['Type'], 'Comment') - self.assertEqual(len(topic.queryCatalog()), 1) - else: - self.portal.invokeFactory('Collection', id='collection') - collection = self.portal.collection - collection.query = [{ - 'i': 'Type', - 'o': 'plone.app.querystring.operation.string.is', - 'v': 'Comment', - }] - - self.assertEqual(collection.results().length, 1) - self.assertEqual(collection.results()[0].text, 'Comment text') - self.assertEqual(collection.results()[0].creator, 'jim') - self.assertEqual(collection.results()[0].author_name, 'Jim') - class NoConversationCatalogTest(unittest.TestCase): @@ -593,7 +568,3 @@ class NoConversationCatalogTest(unittest.TestCase): 'plone.app.discussion:conversation' not in IAnnotations(self.portal.doc1) ) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_comment.py b/plone/app/discussion/tests/test_comment.py index 1f39098..5277f5f 100644 --- a/plone/app/discussion/tests/test_comment.py +++ b/plone/app/discussion/tests/test_comment.py @@ -125,11 +125,33 @@ class CommentTest(unittest.TestCase): conversation.addComment(comment1) self.assertEqual(u"Tarek Ziadé on Document äüö", comment1.Title()) + def test_title_special_characters_utf8(self): + self.portal.invokeFactory( + id='doc_sp_chars_utf8', + title='Document ëïû', + type_name='Document' + ) + conversation = IConversation(self.portal.doc_sp_chars_utf8) + comment1 = createObject('plone.Comment') + comment1.author_name = "Hüüb Bôûmä" + conversation.addComment(comment1) + self.assertEqual(u"Hüüb Bôûmä on Document ëïû", comment1.Title()) + def test_creator(self): comment1 = createObject('plone.Comment') comment1.creator = "jim" self.assertEqual("jim", comment1.Creator()) + def test_creator_author_name(self): + comment1 = createObject('plone.Comment') + comment1.author_name = "joey" + self.assertEqual("joey", comment1.Creator()) + + def test_owner(self): + comment1 = createObject('plone.Comment') + self.assertEqual((['plone', 'acl_users'], TEST_USER_ID), + comment1.getOwnerTuple()) + def test_type(self): comment1 = createObject('plone.Comment') self.assertEqual(comment1.Type(), 'Comment') @@ -498,7 +520,3 @@ class RepliesTest(unittest.TestCase): str(new_re_re_re_id), re_re_re_comment.absolute_url() ) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_comments_viewlet.py b/plone/app/discussion/tests/test_comments_viewlet.py index f4a3d1e..6619b1a 100644 --- a/plone/app/discussion/tests/test_comments_viewlet.py +++ b/plone/app/discussion/tests/test_comments_viewlet.py @@ -26,19 +26,21 @@ from Products.CMFCore.utils import getToolByName from Products.CMFPlone.tests import dummy -from plone.app.testing import TEST_USER_ID, setRoles +from plone.app.testing import TEST_USER_ID, TEST_USER_NAME, setRoles from plone.app.testing import logout from plone.app.testing import login from plone.app.discussion.browser.comments import CommentsViewlet from plone.app.discussion.browser.comments import CommentForm +from plone.app.discussion.browser.comment import EditCommentForm from plone.app.discussion import interfaces from plone.app.discussion.interfaces import IConversation from plone.app.discussion.testing import ( PLONE_APP_DISCUSSION_INTEGRATION_TESTING ) from plone.app.discussion.interfaces import IDiscussionSettings +from plone.app.discussion.interfaces import IConversation class TestCommentForm(unittest.TestCase): @@ -126,15 +128,198 @@ class TestCommentForm(unittest.TestCase): for comment in comments: self.assertEqual(comment.text, u"bar") - self.assertEqual(comment.creator, "test-user") + self.assertEqual(comment.creator, "test_user_1_") self.assertEqual(comment.getOwner().getUserName(), "test-user") local_roles = comment.get_local_roles() self.assertEqual(len(local_roles), 1) userid, roles = local_roles[0] - self.assertEqual(userid, 'test-user') + self.assertEqual(userid, 'test_user_1_') self.assertEqual(len(roles), 1) self.assertEqual(roles[0], 'Owner') + def test_edit_comment(self): + """Edit a comment as logged-in user. + """ + + # Allow discussion + self.portal.doc1.allow_discussion = True + self.viewlet = CommentsViewlet(self.context, self.request, None, None) + + def make_request(form={}): + request = TestRequest() + request.form.update(form) + alsoProvides(request, IFormLayer) + alsoProvides(request, IAttributeAnnotatable) + return request + + provideAdapter( + adapts=(Interface, IBrowserRequest), + provides=Interface, + factory=CommentForm, + name=u"comment-form" + ) + + provideAdapter( + adapts=(Interface, IBrowserRequest), + provides=Interface, + factory=EditCommentForm, + name=u"edit-comment-form" + ) + + # The form is submitted successfully, if the required text field is + # filled out + request = make_request(form={'form.widgets.text': u'bar'}) + + commentForm = getMultiAdapter( + (self.context, request), + name=u"comment-form" + ) + commentForm.update() + data, errors = commentForm.extractData() # pylint: disable-msg=W0612 + + self.assertEqual(len(errors), 0) + self.assertFalse(commentForm.handleComment(commentForm, "foo")) + + # Edit the last comment + conversation = IConversation(self.context) + comment = [x for x in conversation.getComments()][-1] + request = make_request(form={'form.widgets.text': u'foobar'}) + editForm = getMultiAdapter( + (comment, request), + name=u"edit-comment-form" + ) + editForm.update() + data, errors = editForm.extractData() # pylint: disable-msg=W0612 + + self.assertEqual(len(errors), 0) + self.assertFalse(editForm.handleComment(editForm, "foo")) + comment = [x for x in conversation.getComments()][-1] + self.assertEquals(comment.text, u"foobar") + + comments = IConversation(commentForm.context).getComments() + comments = [comment for comment in comments] # consume itertor + self.assertEqual(len(comments), 1) + + for comment in comments: + self.assertEqual(comment.text, u"foobar") + self.assertEqual(comment.creator, "test_user_1_") + + self.assertEqual(comment.getOwner().getUserName(), "test-user") + local_roles = comment.get_local_roles() + self.assertEqual(len(local_roles), 1) + userid, roles = local_roles[0] + self.assertEqual(userid, 'test_user_1_') + self.assertEqual(len(roles), 1) + self.assertEqual(roles[0], 'Owner') + + def test_delete_comment(self): + """Delete a comment as logged-in user. + """ + + # Allow discussion + self.portal.doc1.allow_discussion = True + self.viewlet = CommentsViewlet(self.context, self.request, None, None) + + def make_request(form={}): + request = TestRequest() + request.form.update(form) + alsoProvides(request, IFormLayer) + alsoProvides(request, IAttributeAnnotatable) + return request + + provideAdapter( + adapts=(Interface, IBrowserRequest), + provides=Interface, + factory=CommentForm, + name=u"comment-form" + ) + + # The form is submitted successfully, if the required text field is + # filled out + form_request = make_request(form={'form.widgets.text': u'bar'}) + + commentForm = getMultiAdapter( + (self.context, form_request), + name=u"comment-form" + ) + + commentForm.update() + data, errors = commentForm.extractData() # pylint: disable-msg=W0612 + self.assertEqual(len(errors), 0) + self.assertFalse(commentForm.handleComment(commentForm, "foo")) + + # Delete the last comment + conversation = IConversation(self.context) + comment = [x for x in conversation.getComments()][-1] + deleteView = getMultiAdapter( + (comment, self.request), + name=u"moderate-delete-comment" + ) + # try to delete last comment without "Delete comments" permission + setRoles(self.portal, TEST_USER_ID, ['Member']) + self.assertRaises(Unauthorized, comment.restrictedTraverse, "@@moderate-delete-comment") + deleteView() + self.assertEqual(1, len([x for x in conversation.getComments()])) + # try to delete last comment with "Delete comments" permission + setRoles(self.portal, TEST_USER_ID, ['Reviewer']) + deleteView() + self.assertEqual(0, len([x for x in conversation.getComments()])) + setRoles(self.portal, TEST_USER_ID, ['Manager']) + + def test_delete_own_comment(self): + """Delete own comment as logged-in user. + """ + + # Allow discussion + self.portal.doc1.allow_discussion = True + self.viewlet = CommentsViewlet(self.context, self.request, None, None) + + def make_request(form={}): + request = TestRequest() + request.form.update(form) + alsoProvides(request, IFormLayer) + alsoProvides(request, IAttributeAnnotatable) + return request + + provideAdapter( + adapts=(Interface, IBrowserRequest), + provides=Interface, + factory=CommentForm, + name=u"comment-form" + ) + + # The form is submitted successfully, if the required text field is + # filled out + form_request = make_request(form={'form.widgets.text': u'bar'}) + + commentForm = getMultiAdapter( + (self.context, form_request), + name=u"comment-form" + ) + + commentForm.update() + data, errors = commentForm.extractData() # pylint: disable-msg=W0612 + self.assertEqual(len(errors), 0) + self.assertFalse(commentForm.handleComment(commentForm, "foo")) + + # Delete the last comment + conversation = IConversation(self.context) + comment = [x for x in conversation.getComments()][-1] + deleteView = getMultiAdapter( + (comment, self.request), + name=u"delete-own-comment" + ) + # try to delete last comment with johndoe + setRoles(self.portal, 'johndoe', ['Member']) + login(self.portal, 'johndoe') + self.assertRaises(Unauthorized, comment.restrictedTraverse, "@@delete-own-comment") + self.assertEqual(1, len([x for x in conversation.getComments()])) + # try to delete last comment with the same user that created it + login(self.portal, TEST_USER_NAME) + setRoles(self.portal, TEST_USER_ID, ['Member']) + deleteView() + self.assertEqual(0, len([x for x in conversation.getComments()])) + def test_add_anonymous_comment(self): self.portal.doc1.allow_discussion = True @@ -477,9 +662,13 @@ class TestCommentsViewlet(unittest.TestCase): ) def test_get_commenter_portrait_is_none(self): - self.assertEqual( - self.viewlet.get_commenter_portrait(), - 'defaultUser.gif' + + self.assertTrue( + self.viewlet.get_commenter_portrait() in ( + 'defaultUser.png', + 'defaultUser.gif', + ) + ) def test_get_commenter_portrait_without_userimage(self): @@ -558,7 +747,3 @@ class TestCommentsViewlet(unittest.TestCase): localized_time = self.viewlet.format_time(python_time) self.assertTrue( localized_time in ['Feb 01, 2009 11:32 PM', '2009-02-01 23:32']) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_contentrules.py b/plone/app/discussion/tests/test_contentrules.py new file mode 100644 index 0000000..a9e9bf1 --- /dev/null +++ b/plone/app/discussion/tests/test_contentrules.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- + +import unittest2 as unittest +from zope.component import createObject, getAdapter +from plone.app.testing import TEST_USER_ID, setRoles + +from plone.contentrules.rule.interfaces import IRuleEventType +from plone.stringinterp.interfaces import IStringSubstitution + +from plone.app.discussion.interfaces import IConversation, IReplies +from plone.app.discussion.interfaces import ICommentAddedEvent +from plone.app.discussion.interfaces import ICommentRemovedEvent +from plone.app.discussion.interfaces import IReplyAddedEvent +from plone.app.discussion.interfaces import IReplyRemovedEvent + +from plone.app.discussion.testing import ( + PLONE_APP_DISCUSSION_INTEGRATION_TESTING, +) + +class CommentContentRulesTest(unittest.TestCase): + """ Test custom comments events + """ + layer = PLONE_APP_DISCUSSION_INTEGRATION_TESTING + + def setUp(self): + # Setup sandbox + self.portal = self.layer['portal'] + self.request = self.layer['request'] + + # Setup current user properties + member = self.portal.portal_membership.getMemberById(TEST_USER_ID) + member.setMemberProperties({ + 'fullname': 'X Manager', + 'email': 'xmanager@example.com' + }) + + setRoles(self.portal, TEST_USER_ID, ['Manager']) + name = self.portal.invokeFactory( + id='doc1', + title='Document 1', + type_name='Document') + + self.document = self.portal[name] + + comment = createObject('plone.Comment') + comment.text = "This is a comment" + comment.author_username = "jim" + comment.author_name = "Jim" + comment.author_email = "jim@example.com" + conversation = IConversation(self.document) + conversation.addComment(comment) + + + def testEventTypesMarked(self): + self.assertTrue(IRuleEventType.providedBy(ICommentAddedEvent)) + self.assertTrue(IRuleEventType.providedBy(ICommentRemovedEvent)) + self.assertTrue(IRuleEventType.providedBy(IReplyAddedEvent)) + self.assertTrue(IRuleEventType.providedBy(IReplyRemovedEvent)) + + def testCommentIdStringSubstitution(self): + comment_id = getAdapter(self.document, IStringSubstitution, + name=u"comment_id") + self.assertIsInstance(comment_id(), long) + + def testCommentTextStringSubstitution(self): + comment_text = getAdapter(self.document, IStringSubstitution, + name=u"comment_text") + self.assertEqual(comment_text(), u"This is a comment") + + def testCommentUserIdStringSubstitution(self): + comment_user_id = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_id") + self.assertEqual(comment_user_id(), u"jim") + + def testCommentUserFullNameStringSubstitution(self): + comment_user_fullname = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_fullname") + self.assertEqual(comment_user_fullname(), u"Jim") + + def testCommentUserEmailStringSubstitution(self): + comment_user_email = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_email") + self.assertEqual(comment_user_email(), u"jim@example.com") + + +class ReplyContentRulesTest(unittest.TestCase): + """ Test custom comments events + """ + layer = PLONE_APP_DISCUSSION_INTEGRATION_TESTING + + def setUp(self): + # Setup sandbox + self.portal = self.layer['portal'] + self.request = self.layer['request'] + setRoles(self.portal, TEST_USER_ID, ['Manager']) + name = self.portal.invokeFactory( + id='doc1', + title='Document 1', + type_name='Document') + + self.document = self.portal[name] + conversation = IConversation(self.document) + replies = IReplies(conversation) + + comment = createObject('plone.Comment') + comment.text = 'This is a comment' + new_id = replies.addComment(comment) + comment = self.document.restrictedTraverse( + '++conversation++default/%s' % new_id) + + re_comment = createObject('plone.Comment') + re_comment.text = 'This is a reply' + re_comment.author_username = "julia" + re_comment.author_name = "Juliana" + re_comment.author_email = "julia@example.com" + + replies = IReplies(comment) + new_re_id = replies.addComment(re_comment) + + def testReplyIdStringSubstitution(self): + reply_id = getAdapter(self.document, IStringSubstitution, + name=u"comment_id") + self.assertIsInstance(reply_id(), long) + + def testReplyTextStringSubstitution(self): + reply_text = getAdapter(self.document, IStringSubstitution, + name=u"comment_text") + self.assertEqual(reply_text(), u"This is a reply") + + def testReplyUserIdStringSubstitution(self): + reply_user_id = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_id") + self.assertEqual(reply_user_id(), u"julia") + + def testReplyUserFullNameStringSubstitution(self): + reply_user_fullname = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_fullname") + self.assertEqual(reply_user_fullname(), u"Juliana") + + def testReplyUserEmailStringSubstitution(self): + reply_user_email = getAdapter(self.document, IStringSubstitution, + name=u"comment_user_email") + self.assertEqual(reply_user_email(), u"julia@example.com") diff --git a/plone/app/discussion/tests/test_controlpanel.py b/plone/app/discussion/tests/test_controlpanel.py index 5d97b5b..b2ded5b 100644 --- a/plone/app/discussion/tests/test_controlpanel.py +++ b/plone/app/discussion/tests/test_controlpanel.py @@ -81,6 +81,22 @@ class RegistryTest(unittest.TestCase): False ) + def test_edit_comment_enabled(self): + # Check edit_comment_enabled record + self.assertTrue('edit_comment_enabled' in IDiscussionSettings) + self.assertEqual( + self.registry['plone.app.discussion.interfaces.' + + 'IDiscussionSettings.edit_comment_enabled'], + False) + + def test_delete_own_comment_enabled(self): + # Check delete_own_comment_enabled record + self.assertTrue('delete_own_comment_enabled' in IDiscussionSettings) + self.assertEqual( + self.registry['plone.app.discussion.interfaces.' + + 'IDiscussionSettings.delete_own_comment_enabled'], + False) + def test_text_transform(self): self.assertTrue('text_transform' in IDiscussionSettings) self.assertEqual( @@ -213,7 +229,3 @@ class ConfigurationChangedSubscriberTest(unittest.TestCase): # enable_moderation checkbox in the discussion control panel. The # setting itself remains unchanged. self.settings.moderation_enabled = True - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_conversation.py b/plone/app/discussion/tests/test_conversation.py index 770e3af..8400b05 100644 --- a/plone/app/discussion/tests/test_conversation.py +++ b/plone/app/discussion/tests/test_conversation.py @@ -308,7 +308,7 @@ class ConversationTest(unittest.TestCase): # Create a folder self.typetool.constructContent('Folder', self.portal, 'f1') - f1 = self.portal.f1 + # Usually we don't create a conversation on a folder conversation = self.portal.f1.restrictedTraverse('@@conversation_view') @@ -873,7 +873,3 @@ class RepliesTest(unittest.TestCase): self.assertEqual(len(replies_to_comment1), 2) self.assertEqual(len(replies_to_comment1_1), 1) self.assertEqual(len(replies_to_comment2), 1) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_events.py b/plone/app/discussion/tests/test_events.py new file mode 100644 index 0000000..11ab4c9 --- /dev/null +++ b/plone/app/discussion/tests/test_events.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- + +import unittest2 as unittest +from zope.component import createObject +from Zope2.App import zcml +import Products.Five +from plone.app.testing import TEST_USER_ID, setRoles +from plone.app.discussion.interfaces import IConversation, IReplies +from plone.app.discussion.testing import ( + PLONE_APP_DISCUSSION_INTEGRATION_TESTING, +) +# +# Fake events registry +# +class EventsRegistry(object): + """ Fake registry to be used while testing discussion events + """ + commentAdded = False + commentRemoved = False + replyAdded = False + replyRemoved = False + +# +# Fake event handlers +# +def comment_added(doc, evt): + EventsRegistry.commentAdded = True + +def comment_removed(doc, evt): + EventsRegistry.commentRemoved = True + +def reply_added(doc, evt): + EventsRegistry.replyAdded = True + +def reply_removed(doc, evt): + EventsRegistry.replyRemoved = True +# +# Tests +# +class CommentEventsTest(unittest.TestCase): + """ Test custom comments events + """ + layer = PLONE_APP_DISCUSSION_INTEGRATION_TESTING + + def setUp(self): + + # Setup sandbox + self.portal = self.layer['portal'] + self.request = self.layer['request'] + self.registry = EventsRegistry + + setRoles(self.portal, TEST_USER_ID, ['Manager']) + name = self.portal.invokeFactory( + id='doc1', + title='Document 1', + type_name='Document') + + self.document = self.portal[name] + + # + # Subscribers + # + configure = """ + + + + + + + + """ + zcml.load_config("configure.zcml", Products.Five) + zcml.load_string(configure) + + def test_addEvent(self): + self.assertFalse(self.registry.commentAdded) + comment = createObject('plone.Comment') + conversation = IConversation(self.document) + conversation.addComment(comment) + self.assertTrue(self.registry.commentAdded) + + def test_removedEvent(self): + self.assertFalse(self.registry.commentRemoved) + comment = createObject('plone.Comment') + conversation = IConversation(self.document) + cid = conversation.addComment(comment) + del conversation[cid] + self.assertTrue(self.registry.commentRemoved) + +class RepliesEventsTest(unittest.TestCase): + """ Test custom replies events + """ + layer = PLONE_APP_DISCUSSION_INTEGRATION_TESTING + + def setUp(self): + self.portal = self.layer['portal'] + self.request = self.layer['request'] + self.registry = EventsRegistry + + setRoles(self.portal, TEST_USER_ID, ['Manager']) + name = self.portal.invokeFactory( + id='doc1', + title='Document 1', + type_name='Document') + + self.document = self.portal[name] + + # + # Subscribers + # + configure = """ + + + + + + + + """ + zcml.load_config("configure.zcml", Products.Five) + zcml.load_string(configure) + + def test_addEvent(self): + self.assertFalse(self.registry.replyAdded) + + conversation = IConversation(self.document) + replies = IReplies(conversation) + + comment = createObject('plone.Comment') + comment.text = 'Comment text' + new_id = replies.addComment(comment) + comment = self.document.restrictedTraverse( + '++conversation++default/%s' % new_id) + + re_comment = createObject('plone.Comment') + re_comment.text = 'Comment text' + + replies = IReplies(comment) + new_re_id = replies.addComment(re_comment) + + self.assertTrue(self.registry.replyAdded) + + def test_removedEvent(self): + self.assertFalse(self.registry.replyRemoved) + + conversation = IConversation(self.portal.doc1) + replies = IReplies(conversation) + + comment = createObject('plone.Comment') + comment.text = 'Comment text' + new_id = replies.addComment(comment) + comment = self.portal.doc1.restrictedTraverse( + '++conversation++default/%s' % new_id) + + re_comment = createObject('plone.Comment') + re_comment.text = 'Comment text' + replies = IReplies(comment) + new_re_id = replies.addComment(re_comment) + + del replies[new_re_id] + self.assertTrue(self.registry.replyRemoved) diff --git a/plone/app/discussion/tests/test_indexers.py b/plone/app/discussion/tests/test_indexers.py index 0701e27..23721f0 100644 --- a/plone/app/discussion/tests/test_indexers.py +++ b/plone/app/discussion/tests/test_indexers.py @@ -203,7 +203,3 @@ class CommentIndexersTest(unittest.TestCase): # make sure in_response_to returns the title or id of the content # object the comment was added to self.assertEqual(catalog.in_response_to(self.comment)(), 'Document 1') - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_moderation_view.py b/plone/app/discussion/tests/test_moderation_view.py index 33064b6..c533190 100644 --- a/plone/app/discussion/tests/test_moderation_view.py +++ b/plone/app/discussion/tests/test_moderation_view.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- import unittest -from DateTime import DateTime - from zope.component import createObject from Products.CMFCore.utils import getToolByName @@ -165,7 +163,3 @@ class ModerationBulkActionsViewTest(unittest.TestCase): comment = self.conversation.getComments().next() self.assertTrue(comment) self.assertEqual(comment, self.comment2) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_notifications.py b/plone/app/discussion/tests/test_notifications.py index 90b6707..3b87f9b 100644 --- a/plone/app/discussion/tests/test_notifications.py +++ b/plone/app/discussion/tests/test_notifications.py @@ -7,11 +7,13 @@ from Acquisition import aq_base from zope.component import createObject from zope.component import getSiteManager from zope.component import queryUtility +from zope.component import getUtility from plone.app.testing import TEST_USER_ID, setRoles from Products.MailHost.interfaces import IMailHost from Products.CMFPlone.tests.utils import MockMailHost +from Products.CMFPlone.interfaces import IMailSchema from plone.registry.interfaces import IRegistry @@ -34,7 +36,9 @@ class TestUserNotificationUnit(unittest.TestCase): sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # We need to fake a valid mail setup - self.portal.email_from_address = "portal@plone.test" + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + mail_settings.email_from_address = "portal@plone.test" self.mailhost = self.portal.MailHost # Enable user notification setting registry = queryUtility(IRegistry) @@ -122,7 +126,9 @@ class TestUserNotificationUnit(unittest.TestCase): def test_do_not_notify_user_when_no_sender_is_available(self): # Set sender mail address to none and make sure no email is send to # the moderator. - self.portal.email_from_address = None + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + mail_settings.email_from_address = None comment = createObject('plone.Comment') comment.text = 'Comment text' comment.user_notification = True @@ -132,7 +138,6 @@ class TestUserNotificationUnit(unittest.TestCase): comment.text = 'Comment text' self.conversation.addComment(comment) - self.assertEqual(len(self.mailhost.messages), 0) def test_notify_only_once(self): @@ -172,7 +177,9 @@ class TestModeratorNotificationUnit(unittest.TestCase): sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # We need to fake a valid mail setup - self.portal.email_from_address = "portal@plone.test" + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + mail_settings.email_from_address = "portal@plone.test" self.mailhost = self.portal.MailHost # Enable comment moderation self.portal.portal_types['Document'].allow_discussion = True @@ -255,7 +262,9 @@ class TestModeratorNotificationUnit(unittest.TestCase): def test_do_not_notify_moderator_when_no_sender_is_available(self): # Set sender mail address to nonw and make sure no email is send to the # moderator. - self.portal.email_from_address = None + registry = getUtility(IRegistry) + mail_settings = registry.forInterface(IMailSchema, prefix='plone') + mail_settings.email_from_address = None comment = createObject('plone.Comment') comment.text = 'Comment text' @@ -275,7 +284,3 @@ class TestModeratorNotificationUnit(unittest.TestCase): self.conversation.addComment(comment) self.assertEqual(len(self.mailhost.messages), 0) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/tests/test_robot.py b/plone/app/discussion/tests/test_robot.py new file mode 100644 index 0000000..3b9eb21 --- /dev/null +++ b/plone/app/discussion/tests/test_robot.py @@ -0,0 +1,27 @@ +from plone.app.discussion.testing import PLONE_APP_DISCUSSION_ROBOT_TESTING +from plone.app.testing import ROBOT_TEST_LEVEL +from plone.testing import layered +import os +import unittest +import robotsuite + + +def test_suite(): + suite = unittest.TestSuite() + current_dir = os.path.abspath(os.path.dirname(__file__)) + robot_dir = os.path.join(current_dir, 'robot') + robot_tests = [ + os.path.join('robot', doc) for doc in + os.listdir(robot_dir) if doc.endswith('.robot') and + doc.startswith('test_') + ] + for robot_test in robot_tests: + robottestsuite = robotsuite.RobotTestSuite(robot_test) + robottestsuite.level = ROBOT_TEST_LEVEL + suite.addTests([ + layered( + robottestsuite, + layer=PLONE_APP_DISCUSSION_ROBOT_TESTING + ), + ]) + return suite diff --git a/plone/app/discussion/tests/test_workflow.py b/plone/app/discussion/tests/test_workflow.py index e54fecd..c8cf216 100644 --- a/plone/app/discussion/tests/test_workflow.py +++ b/plone/app/discussion/tests/test_workflow.py @@ -274,7 +274,3 @@ class CommentReviewWorkflowTest(unittest.TestCase): 'review_state' ) ) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/plone/app/discussion/upgrades.py b/plone/app/discussion/upgrades.py index bf9df71..652e060 100644 --- a/plone/app/discussion/upgrades.py +++ b/plone/app/discussion/upgrades.py @@ -2,7 +2,13 @@ from zope.component import getUtility from plone.registry.interfaces import IRegistry from plone.app.discussion.interfaces import IDiscussionSettings +default_profile = 'profile-plone.app.discussion:default' + def update_registry(context): registry = getUtility(IRegistry) registry.registerInterface(IDiscussionSettings) + + +def update_rolemap(context): + context.runImportStepFromProfile(default_profile, 'rolemap') diff --git a/setup.py b/setup.py index af74549..abc69e9 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ -from setuptools import setup, find_packages +from setuptools import find_packages +from setuptools import setup -version = '2.3.0dev' +version = '2.4.0.dev0' install_requires = [ 'setuptools', @@ -51,7 +52,11 @@ setup(name='plone.app.discussion', extras_require={ 'test': [ 'plone.app.testing', - 'plone.app.contenttypes', + 'plone.stringinterp', + 'plone.contentrules', + 'plone.app.contentrules', + 'plone.app.contenttypes[test]', + 'plone.app.robotframework[ride,reload]', ] }, entry_points=""" diff --git a/travis.cfg b/travis.cfg new file mode 100644 index 0000000..d77bda1 --- /dev/null +++ b/travis.cfg @@ -0,0 +1,21 @@ +[buildout] +extends = buildout.cfg +parts += + download + install + code-analysis +eggs-directory = buildout-cache/eggs +download-cache = buildout-cache/downloads + +[download] +recipe = hexagonit.recipe.download +url = https://launchpad.net/plone/4.3/4.3.4/+download/Plone-4.3.4-UnifiedInstaller.tgz + +[install] +recipe = collective.recipe.cmd +on_install = true +cmds = tar jxvf ${download:location}/Plone-4.3.4-UnifiedInstaller/packages/buildout-cache.tar.bz2 1>/dev/null + +[code-analysis] +recipe = plone.recipe.codeanalysis +return-status-codes = True