remotes/origin/1203
commit
1c9e24870f
206 changed files with 29777 additions and 2 deletions
@ -0,0 +1,6 @@ |
||||
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages |
||||
try: |
||||
__import__('pkg_resources').declare_namespace(__name__) |
||||
except ImportError: |
||||
from pkgutil import extend_path |
||||
__path__ = extend_path(__path__, __name__) |
||||
@ -0,0 +1,6 @@ |
||||
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages |
||||
try: |
||||
__import__('pkg_resources').declare_namespace(__name__) |
||||
except ImportError: |
||||
from pkgutil import extend_path |
||||
__path__ = extend_path(__path__, __name__) |
||||
@ -0,0 +1,8 @@ |
||||
"""emencia.django.newsletter""" |
||||
__version__ = '0.3.dev' |
||||
__license__ = 'BSD License' |
||||
|
||||
__author__ = 'Fantomas42' |
||||
__email__ = 'fantomas42@gmail.com' |
||||
|
||||
__url__ = 'http://emencia.fr/' |
||||
@ -0,0 +1,35 @@ |
||||
"""Admin for emencia.django.newsletter""" |
||||
from django.contrib import admin |
||||
from django.conf import settings |
||||
|
||||
from emencia.django.newsletter.models import Link |
||||
from emencia.django.newsletter.models import Contact |
||||
from emencia.django.newsletter.models import WorkGroup |
||||
from emencia.django.newsletter.models import SMTPServer |
||||
from emencia.django.newsletter.models import Newsletter |
||||
from emencia.django.newsletter.models import MailingList |
||||
from emencia.django.newsletter.models import ContactMailingStatus |
||||
|
||||
from emencia.django.newsletter.settings import USE_WORKGROUPS |
||||
from emencia.django.newsletter.admin.contact import ContactAdmin |
||||
from emencia.django.newsletter.admin.workgroup import WorkGroupAdmin |
||||
from emencia.django.newsletter.admin.newsletter import NewsletterAdmin |
||||
from emencia.django.newsletter.admin.smtpserver import SMTPServerAdmin |
||||
from emencia.django.newsletter.admin.mailinglist import MailingListAdmin |
||||
|
||||
|
||||
admin.site.register(Contact, ContactAdmin) |
||||
admin.site.register(SMTPServer, SMTPServerAdmin) |
||||
admin.site.register(Newsletter, NewsletterAdmin) |
||||
admin.site.register(MailingList, MailingListAdmin) |
||||
|
||||
if USE_WORKGROUPS: |
||||
admin.site.register(WorkGroup, WorkGroupAdmin) |
||||
|
||||
|
||||
class LinkAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'url', 'creation_date') |
||||
|
||||
if settings.DEBUG: |
||||
admin.site.register(Link, LinkAdmin) |
||||
admin.site.register(ContactMailingStatus) |
||||
@ -0,0 +1,184 @@ |
||||
"""ModelAdmin for Contact""" |
||||
import StringIO |
||||
from django.conf import settings |
||||
from datetime import datetime |
||||
|
||||
from django.contrib import admin |
||||
from django.dispatch import Signal |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
from django.core.urlresolvers import reverse |
||||
from django.shortcuts import render_to_response |
||||
from django.template import RequestContext |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
from django.http import HttpResponseRedirect |
||||
from django.contrib.admin.views.main import ChangeList |
||||
from django.db import DatabaseError |
||||
|
||||
from emencia.django.newsletter.models import MailingList |
||||
from emencia.django.newsletter.settings import USE_WORKGROUPS |
||||
from emencia.django.newsletter.utils.importation import import_dispatcher |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_contacts_pk |
||||
from emencia.django.newsletter.utils.vcard import vcard_contacts_export_response |
||||
from emencia.django.newsletter.utils.excel import ExcelResponse |
||||
|
||||
|
||||
contacts_imported = Signal(providing_args=['source', 'type']) |
||||
|
||||
|
||||
class ContactAdmin(admin.ModelAdmin): |
||||
date_hierarchy = 'creation_date' |
||||
list_display = ('email', 'first_name', 'last_name', 'tags', 'tester', 'subscriber', |
||||
'valid', 'total_subscriptions', 'creation_date', 'related_object_admin') |
||||
list_filter = ('subscriber', 'valid', 'tester', 'creation_date', 'modification_date') |
||||
search_fields = ('email', 'first_name', 'last_name', 'tags') |
||||
fieldsets = ((None, {'fields': ('email', 'first_name', 'last_name')}), |
||||
(None, {'fields': ('tags',)}), |
||||
(_('Status'), {'fields': ('subscriber', 'valid', 'tester')}), |
||||
(_('Advanced'), {'fields': ('object_id', 'content_type'), |
||||
'classes': ('collapse',)}), |
||||
) |
||||
actions = ['create_mailinglist', 'export_vcard', 'export_excel'] |
||||
actions_on_top = False |
||||
actions_on_bottom = True |
||||
|
||||
def queryset(self, request): |
||||
queryset = super(ContactAdmin, self).queryset(request) |
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
contacts_pk = request_workgroups_contacts_pk(request) |
||||
queryset = queryset.filter(pk__in=contacts_pk) |
||||
return queryset |
||||
|
||||
def save_model(self, request, contact, form, change): |
||||
workgroups = [] |
||||
if not contact.pk and not request.user.is_superuser \ |
||||
and USE_WORKGROUPS: |
||||
workgroups = request_workgroups(request) |
||||
contact.save() |
||||
for workgroup in workgroups: |
||||
workgroup.contacts.add(contact) |
||||
|
||||
def related_object_admin(self, contact): |
||||
"""Display link to related object's admin""" |
||||
if contact.content_type and contact.object_id: |
||||
admin_url = reverse('admin:%s_%s_change' % (contact.content_type.app_label, |
||||
contact.content_type.model), |
||||
args=(contact.object_id,)) |
||||
return '%s: <a href="%s">%s</a>' % (contact.content_type.model.capitalize(), |
||||
admin_url, |
||||
contact.content_object.__unicode__()) |
||||
return _('No relative object') |
||||
related_object_admin.allow_tags = True |
||||
related_object_admin.short_description = _('Related object') |
||||
|
||||
def total_subscriptions(self, contact): |
||||
"""Display user subscriptions to unsubscriptions""" |
||||
subscriptions = contact.subscriptions().count() |
||||
unsubscriptions = contact.unsubscriptions().count() |
||||
return '%s / %s' % (subscriptions - unsubscriptions, subscriptions) |
||||
total_subscriptions.short_description = _('Total subscriptions') |
||||
|
||||
def export_vcard(self, request, queryset, export_name=''): |
||||
"""Export selected contact in VCard""" |
||||
return vcard_contacts_export_response(queryset) |
||||
export_vcard.short_description = _('Export contacts as VCard') |
||||
|
||||
def export_excel(self, request, queryset, export_name=''): |
||||
"""Export selected contact in Excel""" |
||||
if not export_name: |
||||
export_name = 'contacts_edn_%s' % datetime.now().strftime('%d-%m-%Y') |
||||
return ExcelResponse(queryset, export_name) |
||||
export_excel.short_description = _('Export contacts in Excel') |
||||
|
||||
def create_mailinglist(self, request, queryset): |
||||
"""Create a mailing list from selected contact""" |
||||
when = str(datetime.now()).split('.')[0] |
||||
new_mailing = MailingList(name=_('New mailinglist at %s') % when, |
||||
description=_('New mailing list created in admin at %s') % when) |
||||
new_mailing.save() |
||||
|
||||
if 'lite' in settings.DATABASES['default']['ENGINE']: |
||||
self.message_user(request, _('SQLite3 or a SpatialLite database type detected, ' \ |
||||
'please note you will be limited to 999 contacts ' \ |
||||
'per mailing list.')) |
||||
try: |
||||
new_mailing.subscribers = queryset.all() |
||||
except DatabaseError: |
||||
new_mailing.subscribers = queryset.none() |
||||
|
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
for workgroup in request_workgroups(request): |
||||
workgroup.mailinglists.add(new_mailing) |
||||
|
||||
self.message_user(request, _('%s succesfully created.') % new_mailing) |
||||
return HttpResponseRedirect(reverse('admin:newsletter_mailinglist_change', |
||||
args=[new_mailing.pk])) |
||||
create_mailinglist.short_description = _('Create a mailinglist') |
||||
|
||||
def importation(self, request): |
||||
"""Import contacts from a VCard""" |
||||
opts = self.model._meta |
||||
|
||||
if request.POST: |
||||
source = request.FILES.get('source') or \ |
||||
StringIO.StringIO(request.POST.get('source', '')) |
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
workgroups = request_workgroups(request) |
||||
else: |
||||
workgroups = [] |
||||
inserted = import_dispatcher(source, request.POST['type'], |
||||
workgroups) |
||||
if inserted: |
||||
contacts_imported.send(sender=self, source=source, |
||||
type=request.POST['type']) |
||||
|
||||
self.message_user(request, _('%s contacts succesfully imported.') % inserted) |
||||
|
||||
context = {'title': _('Contact importation'), |
||||
'opts': opts, |
||||
'root_path': self.admin_site.root_path, |
||||
'app_label': opts.app_label} |
||||
|
||||
return render_to_response('newsletter/contact_import.html', |
||||
context, RequestContext(request)) |
||||
|
||||
def filtered_request_queryset(self, request): |
||||
"""Return queryset filtered by the admin list view""" |
||||
cl = ChangeList(request, self.model, self.list_display, |
||||
self.list_display_links, self.list_filter, |
||||
self.date_hierarchy, self.search_fields, |
||||
self.list_select_related, self.list_per_page, |
||||
self.list_editable, self) |
||||
return cl.get_query_set() |
||||
|
||||
def creation_mailinglist(self, request): |
||||
"""Create a mailing list form the filtered contacts""" |
||||
return self.create_mailinglist(request, self.filtered_request_queryset(request)) |
||||
|
||||
def exportation_vcard(self, request): |
||||
"""Export filtered contacts in VCard""" |
||||
return self.export_vcard(request, self.filtered_request_queryset(request), |
||||
'contacts_edn_%s' % datetime.now().strftime('%d-%m-%Y')) |
||||
|
||||
def exportation_excel(self, request): |
||||
"""Export filtered contacts in Excel""" |
||||
return self.export_excel(request, self.filtered_request_queryset(request), |
||||
'contacts_edn_%s' % datetime.now().strftime('%d-%m-%Y')) |
||||
|
||||
def get_urls(self): |
||||
urls = super(ContactAdmin, self).get_urls() |
||||
my_urls = patterns('', |
||||
url(r'^import/$', |
||||
self.admin_site.admin_view(self.importation), |
||||
name='newsletter_contact_import'), |
||||
url(r'^create_mailinglist/$', |
||||
self.admin_site.admin_view(self.creation_mailinglist), |
||||
name='newsletter_contact_create_mailinglist'), |
||||
url(r'^export/vcard/$', |
||||
self.admin_site.admin_view(self.exportation_vcard), |
||||
name='newsletter_contact_export_vcard'), |
||||
url(r'^export/excel/$', |
||||
self.admin_site.admin_view(self.exportation_excel), |
||||
name='newsletter_contact_export_excel'),) |
||||
return my_urls + urls |
||||
@ -0,0 +1,125 @@ |
||||
"""ModelAdmin for MailingList""" |
||||
from datetime import datetime |
||||
|
||||
from django.contrib import admin |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
from django.utils.encoding import smart_str |
||||
from django.core.urlresolvers import reverse |
||||
from django.shortcuts import get_object_or_404 |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
from django.http import HttpResponseRedirect |
||||
|
||||
from emencia.django.newsletter.models import Contact |
||||
from emencia.django.newsletter.models import MailingList |
||||
from emencia.django.newsletter.settings import USE_WORKGROUPS |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_contacts_pk |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_mailinglists_pk |
||||
from emencia.django.newsletter.utils.vcard import vcard_contacts_export_response |
||||
from emencia.django.newsletter.utils.excel import ExcelResponse |
||||
|
||||
|
||||
class MailingListAdmin(admin.ModelAdmin): |
||||
date_hierarchy = 'creation_date' |
||||
list_display = ('creation_date', 'name', 'description', |
||||
'subscribers_count', 'unsubscribers_count', |
||||
'exportation_links') |
||||
list_editable = ('name', 'description') |
||||
list_filter = ('creation_date', 'modification_date') |
||||
search_fields = ('name', 'description',) |
||||
filter_horizontal = ['subscribers', 'unsubscribers'] |
||||
fieldsets = ((None, {'fields': ('name', 'description',)}), |
||||
(None, {'fields': ('subscribers',)}), |
||||
(None, {'fields': ('unsubscribers',)}), |
||||
) |
||||
actions = ['merge_mailinglist'] |
||||
actions_on_top = False |
||||
actions_on_bottom = True |
||||
|
||||
def queryset(self, request): |
||||
queryset = super(MailingListAdmin, self).queryset(request) |
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
mailinglists_pk = request_workgroups_mailinglists_pk(request) |
||||
queryset = queryset.filter(pk__in=mailinglists_pk) |
||||
return queryset |
||||
|
||||
def save_model(self, request, mailinglist, form, change): |
||||
workgroups = [] |
||||
if not mailinglist.pk and not request.user.is_superuser \ |
||||
and USE_WORKGROUPS: |
||||
workgroups = request_workgroups(request) |
||||
mailinglist.save() |
||||
for workgroup in workgroups: |
||||
workgroup.mailinglists.add(mailinglist) |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if 'subscribers' in db_field.name and not request.user.is_superuser \ |
||||
and USE_WORKGROUPS: |
||||
contacts_pk = request_workgroups_contacts_pk(request) |
||||
kwargs['queryset'] = Contact.objects.filter(pk__in=contacts_pk) |
||||
return super(MailingListAdmin, self).formfield_for_manytomany( |
||||
db_field, request, **kwargs) |
||||
|
||||
def merge_mailinglist(self, request, queryset): |
||||
"""Merge multiple mailing list""" |
||||
if queryset.count() == 1: |
||||
self.message_user(request, _('Please select a least 2 mailing list.')) |
||||
return None |
||||
|
||||
subscribers = {} |
||||
unsubscribers = {} |
||||
for ml in queryset: |
||||
for contact in ml.subscribers.all(): |
||||
subscribers[contact] = '' |
||||
for contact in ml.unsubscribers.all(): |
||||
unsubscribers[contact] = '' |
||||
|
||||
when = str(datetime.now()).split('.')[0] |
||||
new_mailing = MailingList(name=_('Merging list at %s') % when, |
||||
description=_('Mailing list created by merging at %s') % when) |
||||
new_mailing.save() |
||||
new_mailing.subscribers = subscribers.keys() |
||||
new_mailing.unsubscribers = unsubscribers.keys() |
||||
|
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
for workgroup in request_workgroups(request): |
||||
workgroup.mailinglists.add(new_mailing) |
||||
|
||||
self.message_user(request, _('%s succesfully created by merging.') % new_mailing) |
||||
return HttpResponseRedirect(reverse('admin:newsletter_mailinglist_change', |
||||
args=[new_mailing.pk])) |
||||
merge_mailinglist.short_description = _('Merge selected mailinglists') |
||||
|
||||
def exportation_links(self, mailinglist): |
||||
"""Display links for exportation""" |
||||
return u'<a href="%s">%s</a> / <a href="%s">%s</a>' % ( |
||||
reverse('admin:newsletter_mailinglist_export_excel', |
||||
args=[mailinglist.pk]), _('Excel'), |
||||
reverse('admin:newsletter_mailinglist_export_vcard', |
||||
args=[mailinglist.pk]), _('VCard')) |
||||
exportation_links.allow_tags = True |
||||
exportation_links.short_description = _('Export') |
||||
|
||||
def exportion_vcard(self, request, mailinglist_id): |
||||
"""Export subscribers in the mailing in VCard""" |
||||
mailinglist = get_object_or_404(MailingList, pk=mailinglist_id) |
||||
name = 'contacts_%s' % smart_str(mailinglist.name) |
||||
return vcard_contacts_export_response(mailinglist.subscribers.all(), name) |
||||
|
||||
def exportion_excel(self, request, mailinglist_id): |
||||
"""Export subscribers in the mailing in Excel""" |
||||
mailinglist = get_object_or_404(MailingList, pk=mailinglist_id) |
||||
name = 'contacts_%s' % smart_str(mailinglist.name) |
||||
return ExcelResponse(mailinglist.subscribers.all(), name) |
||||
|
||||
def get_urls(self): |
||||
urls = super(MailingListAdmin, self).get_urls() |
||||
my_urls = patterns('', |
||||
url(r'^export/vcard/(?P<mailinglist_id>\d+)/$', |
||||
self.admin_site.admin_view(self.exportion_vcard), |
||||
name='newsletter_mailinglist_export_vcard'), |
||||
url(r'^export/excel/(?P<mailinglist_id>\d+)/$', |
||||
self.admin_site.admin_view(self.exportion_excel), |
||||
name='newsletter_mailinglist_export_excel')) |
||||
return my_urls + urls |
||||
@ -0,0 +1,185 @@ |
||||
"""ModelAdmin for Newsletter""" |
||||
from HTMLParser import HTMLParseError |
||||
|
||||
from django import forms |
||||
from django.db.models import Q |
||||
from django.contrib import admin |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from emencia.django.newsletter.models import Contact |
||||
from emencia.django.newsletter.models import Newsletter |
||||
from emencia.django.newsletter.models import Attachment |
||||
from emencia.django.newsletter.models import MailingList |
||||
from emencia.django.newsletter.mailer import Mailer |
||||
from emencia.django.newsletter.settings import USE_TINYMCE |
||||
from emencia.django.newsletter.settings import USE_WORKGROUPS |
||||
try: |
||||
CAN_USE_PREMAILER = True |
||||
from emencia.django.newsletter.utils.premailer import Premailer |
||||
from emencia.django.newsletter.utils.premailer import PremailerError |
||||
except ImportError: |
||||
CAN_USE_PREMAILER = False |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_contacts_pk |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_newsletters_pk |
||||
from emencia.django.newsletter.utils.workgroups import request_workgroups_mailinglists_pk |
||||
|
||||
|
||||
class AttachmentAdminInline(admin.TabularInline): |
||||
model = Attachment |
||||
extra = 1 |
||||
fieldsets = ((None, {'fields': (('title', 'file_attachment'))}),) |
||||
|
||||
|
||||
class BaseNewsletterAdmin(admin.ModelAdmin): |
||||
date_hierarchy = 'creation_date' |
||||
list_display = ('title', 'mailing_list', 'server', 'status', |
||||
'sending_date', 'creation_date', 'modification_date', |
||||
'historic_link', 'statistics_link') |
||||
list_filter = ('status', 'sending_date', 'creation_date', 'modification_date') |
||||
search_fields = ('title', 'content', 'header_sender', 'header_reply') |
||||
filter_horizontal = ['test_contacts'] |
||||
fieldsets = ((None, {'fields': ('title', 'content',)}), |
||||
(_('Receivers'), {'fields': ('mailing_list', 'test_contacts',)}), |
||||
(_('Sending'), {'fields': ('sending_date', 'status',)}), |
||||
(_('Miscellaneous'), {'fields': ('server', 'header_sender', |
||||
'header_reply', 'slug'), |
||||
'classes': ('collapse',)}), |
||||
) |
||||
prepopulated_fields = {'slug': ('title',)} |
||||
inlines = (AttachmentAdminInline,) |
||||
actions = ['send_mail_test', 'make_ready_to_send', 'make_cancel_sending'] |
||||
actions_on_top = False |
||||
actions_on_bottom = True |
||||
|
||||
def get_actions(self, request): |
||||
actions = super(BaseNewsletterAdmin, self).get_actions(request) |
||||
if not request.user.has_perm('newsletter.can_change_status'): |
||||
del actions['make_ready_to_send'] |
||||
del actions['make_cancel_sending'] |
||||
return actions |
||||
|
||||
def queryset(self, request): |
||||
queryset = super(BaseNewsletterAdmin, self).queryset(request) |
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
newsletters_pk = request_workgroups_newsletters_pk(request) |
||||
queryset = queryset.filter(pk__in=newsletters_pk) |
||||
return queryset |
||||
|
||||
def formfield_for_foreignkey(self, db_field, request, **kwargs): |
||||
if db_field.name == 'mailing_list' and \ |
||||
not request.user.is_superuser and USE_WORKGROUPS: |
||||
mailinglists_pk = request_workgroups_mailinglists_pk(request) |
||||
kwargs['queryset'] = MailingList.objects.filter(pk__in=mailinglists_pk) |
||||
return db_field.formfield(**kwargs) |
||||
return super(BaseNewsletterAdmin, self).formfield_for_foreignkey( |
||||
db_field, request, **kwargs) |
||||
|
||||
def formfield_for_choice_field(self, db_field, request, **kwargs): |
||||
if db_field.name == 'status' and \ |
||||
not request.user.has_perm('newsletter.can_change_status'): |
||||
kwargs['choices'] = ((Newsletter.DRAFT, _('Default')),) |
||||
return db_field.formfield(**kwargs) |
||||
return super(BaseNewsletterAdmin, self).formfield_for_choice_field( |
||||
db_field, request, **kwargs) |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if db_field.name == 'test_contacts': |
||||
queryset = Contact.objects.filter(tester=True) |
||||
if not request.user.is_superuser and USE_WORKGROUPS: |
||||
contacts_pk = request_workgroups_contacts_pk(request) |
||||
queryset = queryset.filter(pk__in=contacts_pk) |
||||
kwargs['queryset'] = queryset |
||||
return super(BaseNewsletterAdmin, self).formfield_for_manytomany( |
||||
db_field, request, **kwargs) |
||||
|
||||
def save_model(self, request, newsletter, form, change): |
||||
workgroups = [] |
||||
if not newsletter.pk and not request.user.is_superuser \ |
||||
and USE_WORKGROUPS: |
||||
workgroups = request_workgroups(request) |
||||
|
||||
if newsletter.content.startswith('http://'): |
||||
if CAN_USE_PREMAILER: |
||||
try: |
||||
premailer = Premailer(newsletter.content.strip()) |
||||
newsletter.content = premailer.transform() |
||||
except PremailerError: |
||||
self.message_user(request, _('Unable to download HTML, due to errors within.')) |
||||
else: |
||||
self.message_user(request, _('Please install lxml for parsing an URL.')) |
||||
if not request.user.has_perm('newsletter.can_change_status'): |
||||
newsletter.status = form.initial.get('status', Newsletter.DRAFT) |
||||
|
||||
newsletter.save() |
||||
|
||||
for workgroup in workgroups: |
||||
workgroup.newsletters.add(newsletter) |
||||
|
||||
def historic_link(self, newsletter): |
||||
"""Display link for historic""" |
||||
if newsletter.contactmailingstatus_set.count(): |
||||
return u'<a href="%s">%s</a>' % (newsletter.get_historic_url(), _('View historic')) |
||||
return _('Not available') |
||||
historic_link.allow_tags = True |
||||
historic_link.short_description = _('Historic') |
||||
|
||||
def statistics_link(self, newsletter): |
||||
"""Display link for statistics""" |
||||
if newsletter.status == Newsletter.SENDING or \ |
||||
newsletter.status == Newsletter.SENT: |
||||
return u'<a href="%s">%s</a>' % (newsletter.get_statistics_url(), _('View statistics')) |
||||
return _('Not available') |
||||
statistics_link.allow_tags = True |
||||
statistics_link.short_description = _('Statistics') |
||||
|
||||
def send_mail_test(self, request, queryset): |
||||
"""Send newsletter in test""" |
||||
for newsletter in queryset: |
||||
if newsletter.test_contacts.count(): |
||||
mailer = Mailer(newsletter, test=True) |
||||
try: |
||||
mailer.run() |
||||
except HTMLParseError: |
||||
self.message_user(request, _('Unable send newsletter, due to errors within HTML.')) |
||||
continue |
||||
self.message_user(request, _('%s succesfully sent.') % newsletter) |
||||
else: |
||||
self.message_user(request, _('No test contacts assigned for %s.') % newsletter) |
||||
send_mail_test.short_description = _('Send test email') |
||||
|
||||
def make_ready_to_send(self, request, queryset): |
||||
"""Make newsletter ready to send""" |
||||
queryset = queryset.filter(status=Newsletter.DRAFT) |
||||
for newsletter in queryset: |
||||
newsletter.status = Newsletter.WAITING |
||||
newsletter.save() |
||||
self.message_user(request, _('%s newletters are ready to send') % queryset.count()) |
||||
make_ready_to_send.short_description = _('Make ready to send') |
||||
|
||||
def make_cancel_sending(self, request, queryset): |
||||
"""Cancel the sending of newsletters""" |
||||
queryset = queryset.filter(Q(status=Newsletter.WAITING) | |
||||
Q(status=Newsletter.SENDING)) |
||||
for newsletter in queryset: |
||||
newsletter.status = Newsletter.CANCELED |
||||
newsletter.save() |
||||
self.message_user(request, _('%s newletters are cancelled') % queryset.count()) |
||||
make_cancel_sending.short_description = _('Cancel the sending') |
||||
|
||||
|
||||
if USE_TINYMCE: |
||||
from tinymce.widgets import TinyMCE |
||||
|
||||
class NewsletterTinyMCEForm(forms.ModelForm): |
||||
content = forms.CharField( |
||||
widget=TinyMCE(attrs={'cols': 150, 'rows': 80})) |
||||
|
||||
class Meta: |
||||
model = Newsletter |
||||
|
||||
class NewsletterAdmin(BaseNewsletterAdmin): |
||||
form = NewsletterTinyMCEForm |
||||
else: |
||||
class NewsletterAdmin(BaseNewsletterAdmin): |
||||
pass |
||||
@ -0,0 +1,57 @@ |
||||
"""ModelAdmin for SMTPServer""" |
||||
from django import forms |
||||
from django.contrib import admin |
||||
from django.core.exceptions import ValidationError |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from emencia.django.newsletter.models import SMTPServer |
||||
|
||||
|
||||
class SMTPServerAdminForm(forms.ModelForm): |
||||
"""Form ofr SMTPServer with custom validation""" |
||||
|
||||
def clean_headers(self): |
||||
"""Check if the headers are well formated""" |
||||
for line in self.cleaned_data['headers'].splitlines(): |
||||
elems = line.split(':') |
||||
if len(elems) < 2: |
||||
raise ValidationError(_('Invalid syntax, do not forget the ":".')) |
||||
if len(elems) > 2: |
||||
raise ValidationError(_('Invalid syntax, several assignments by line.')) |
||||
|
||||
return self.cleaned_data['headers'] |
||||
|
||||
class Meta: |
||||
model = SMTPServer |
||||
|
||||
|
||||
class SMTPServerAdmin(admin.ModelAdmin): |
||||
form = SMTPServerAdminForm |
||||
list_display = ('name', 'host', 'port', 'user', 'tls', 'mails_hour',) |
||||
list_filter = ('tls',) |
||||
search_fields = ('name', 'host', 'user') |
||||
fieldsets = ((None, {'fields': ('name', )}), |
||||
(_('Configuration'), {'fields': ('host', 'port', |
||||
'user', 'password', 'tls')}), |
||||
(_('Miscellaneous'), {'fields': ('mails_hour', 'headers'), |
||||
'classes': ('collapse', )}), |
||||
) |
||||
actions = ['check_connections'] |
||||
actions_on_top = False |
||||
actions_on_bottom = True |
||||
|
||||
def check_connections(self, request, queryset): |
||||
"""Check the SMTP connection""" |
||||
message = '%s connection %s' |
||||
for server in queryset: |
||||
try: |
||||
smtp = server.connect() |
||||
if smtp: |
||||
status = 'OK' |
||||
smtp.quit() |
||||
else: |
||||
status = 'KO' |
||||
except: |
||||
status = 'KO' |
||||
self.message_user(request, message % (server.__unicode__(), status)) |
||||
check_connections.short_description = _('Check connection') |
||||
@ -0,0 +1,26 @@ |
||||
"""ModelAdmin for WorkGroup""" |
||||
from django.contrib import admin |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
|
||||
class WorkGroupAdmin(admin.ModelAdmin): |
||||
list_display = ('name', 'group', 'contacts_length', |
||||
'mailinglists_length', 'newsletters_length') |
||||
fieldsets = ((None, {'fields': ('name', 'group')}), |
||||
(None, {'fields': ('contacts', 'mailinglists', 'newsletters')}), |
||||
) |
||||
filter_horizontal = ['contacts', 'mailinglists', 'newsletters'] |
||||
actions_on_top = False |
||||
actions_on_bottom = True |
||||
|
||||
def contacts_length(self, workgroup): |
||||
return workgroup.contacts.count() |
||||
contacts_length.short_description = _('Contacts length') |
||||
|
||||
def mailinglists_length(self, workgroup): |
||||
return workgroup.mailinglists.count() |
||||
mailinglists_length.short_description = _('Mailing List length') |
||||
|
||||
def newsletters_length(self, workgroup): |
||||
return workgroup.newsletters.count() |
||||
newsletters_length.short_description = _('Newsletter length') |
||||
@ -0,0 +1,52 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
from ckeditor.widgets import CKEditorWidget |
||||
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter |
||||
from city.models import City |
||||
|
||||
|
||||
class ContactSettingsForm(forms.ModelForm): |
||||
city = forms.CharField(label=u'Город', widget=forms.HiddenInput() ,required=False) |
||||
periodic = forms.ChoiceField(choices=ContactSettings.PERIODIC_CHOICES, |
||||
label=_(u'Периодичность отправки')) |
||||
first_name = forms.CharField(label=_('first name')) |
||||
subscriber = forms.BooleanField(label=_('subscriber'), required=False) |
||||
valid = forms.BooleanField(label=_('valid email'), required=False) |
||||
tester = forms.BooleanField(label=_('contact tester'), required=False) |
||||
|
||||
class Meta: |
||||
model = ContactSettings |
||||
fields = ('periodic', 'exponent_practicum', 'organiser_practicum', 'theme', 'area', 'country', 'city', ) |
||||
|
||||
def save(self, commit=True): |
||||
contactsettings = super(ContactSettingsForm, self).save(commit=False) |
||||
if commit: |
||||
contactsettings.save() |
||||
contact = contactsettings.contact |
||||
contact.first_name = self.cleaned_data['first_name'] |
||||
contact.subscriber = self.cleaned_data['subscriber'] |
||||
contact.valid = self.cleaned_data['valid'] |
||||
contact.tester = self.cleaned_data['tester'] |
||||
contact.save() |
||||
return contactsettings |
||||
|
||||
def clean_periodic(self): |
||||
|
||||
return int(self.cleaned_data['periodic']) |
||||
|
||||
def clean_city(self): |
||||
return City.objects.none() |
||||
|
||||
class MailingListForm(forms.ModelForm): |
||||
class Meta: |
||||
model = MailingList |
||||
fields = ('name', 'description') |
||||
|
||||
class NewsletterForm(forms.ModelForm): |
||||
test_contacts = forms.CharField(label=u'Тестовые контакты', widget=forms.HiddenInput(), required=False) |
||||
content = forms.CharField(label=_('content'), widget=CKEditorWidget(config_name='newsletters')) |
||||
class Meta: |
||||
model = Newsletter |
||||
fields = ('title', 'content', 'mailing_list', 'test_contacts', 'header_sender', |
||||
'header_reply', 'status', 'sending_date', 'slug') |
||||
@ -0,0 +1,20 @@ |
||||
from django.conf.urls import url |
||||
from django.conf.urls import include |
||||
from django.conf.urls import patterns |
||||
from django.http import HttpResponse |
||||
from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ |
||||
CreateMailingList, NewsletterCreate |
||||
|
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^newsletters/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), |
||||
url(r'^newsletters/(?P<pk>\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'), |
||||
url(r'^newsletters/', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), |
||||
|
||||
url(r'^mailinglist/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), |
||||
url(r'^mailinglist/(?P<pk>\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'), |
||||
url(r'^mailinglist/', CreateMailingList.as_view(), name='newsletters_mailinglist_create'), |
||||
|
||||
url(r'^contact/(?P<pk>\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), |
||||
url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), |
||||
) |
||||
@ -0,0 +1,38 @@ |
||||
"""Plugins for CMS""" |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from cms.plugin_base import CMSPluginBase |
||||
from cms.plugin_pool import plugin_pool |
||||
|
||||
from emencia.django.newsletter.cmsplugin_newsletter import settings |
||||
from emencia.django.newsletter.cmsplugin_newsletter.models import SubscriptionFormPlugin |
||||
from emencia.django.newsletter.forms import MailingListSubscriptionForm |
||||
|
||||
|
||||
class CMSSubscriptionFormPlugin(CMSPluginBase): |
||||
module = _('newsletter') |
||||
model = SubscriptionFormPlugin |
||||
name = _('Subscription Form') |
||||
render_template = 'newsletter/cms/subscription_form.html' |
||||
text_enabled = False |
||||
admin_preview = False |
||||
|
||||
def render(self, context, instance, placeholder): |
||||
request = context['request'] |
||||
if request.method == "POST" and (settings.FORM_NAME in request.POST.keys()): |
||||
form = MailingListSubscriptionForm(data=request.POST) |
||||
if form.is_valid(): |
||||
form.save(instance.mailing_list) |
||||
form.saved = True |
||||
else: |
||||
form = MailingListSubscriptionForm() |
||||
context.update({ |
||||
'object': instance, |
||||
'form': form, |
||||
'form_name': settings.FORM_NAME, |
||||
'placeholder': placeholder, |
||||
}) |
||||
return context |
||||
|
||||
|
||||
plugin_pool.register_plugin(CMSSubscriptionFormPlugin) |
||||
@ -0,0 +1,19 @@ |
||||
"""Models of Emencia CMS Plugins""" |
||||
from django.db import models |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from cms.models import CMSPlugin |
||||
|
||||
from emencia.django.newsletter.models import MailingList |
||||
|
||||
|
||||
class SubscriptionFormPlugin(CMSPlugin): |
||||
"""CMS Plugin for susbcribing to a mailing list""" |
||||
title = models.CharField(_('title'), max_length=100, blank=True) |
||||
show_description = models.BooleanField(_('show description'), default=True, |
||||
help_text=_('Show the mailing list\'s description.')) |
||||
mailing_list = models.ForeignKey(MailingList, verbose_name=_('mailing list'), |
||||
help_text=_('Mailing List to subscribe to.')) |
||||
|
||||
def __unicode__(self): |
||||
return self.mailing_list.name |
||||
@ -0,0 +1,4 @@ |
||||
"""Settings for emencia.django.newsletter.cmsplugin_newsletter""" |
||||
from django.conf import settings |
||||
|
||||
FORM_NAME = getattr(settings, 'SUBSCRIPTION_FORM_NAME', 'cms_subscription_form_plugin') |
||||
@ -0,0 +1,79 @@ |
||||
# -*- coding: utf-8 -*- |
||||
"""Forms for emencia.django.newsletter""" |
||||
from django import forms |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from emencia.django.newsletter.models import Contact, ContactSettings |
||||
from emencia.django.newsletter.models import MailingList |
||||
from theme.models import Theme |
||||
|
||||
|
||||
class MailingListSubscriptionForm(forms.ModelForm): |
||||
"""Form for subscribing to a mailing list""" |
||||
# Notes : This form will not check the uniquess of |
||||
# the 'email' field, by defining it explictly and setting |
||||
# it the Meta.exclude list, for allowing registration |
||||
# to a mailing list even if the contact already exists. |
||||
# Then the contact is always added to the subscribers field |
||||
# of the mailing list because it will be cleaned with no |
||||
# double. |
||||
|
||||
email = forms.EmailField(label=_('Email'), max_length=75) |
||||
|
||||
def save(self, mailing_list): |
||||
data = self.cleaned_data |
||||
contact, created = Contact.objects.get_or_create( |
||||
email=data['email'], |
||||
defaults={'first_name': data['first_name'], |
||||
'last_name': data['last_name']}) |
||||
|
||||
mailing_list.subscribers.add(contact) |
||||
mailing_list.unsubscribers.remove(contact) |
||||
|
||||
class Meta: |
||||
model = Contact |
||||
fields = ('first_name', 'last_name') |
||||
exclude = ('email',) |
||||
|
||||
|
||||
class AllMailingListSubscriptionForm(MailingListSubscriptionForm): |
||||
"""Form for subscribing to all mailing list""" |
||||
|
||||
mailing_lists = forms.ModelMultipleChoiceField( |
||||
queryset=MailingList.objects.all(), |
||||
initial=[obj.id for obj in MailingList.objects.all()], |
||||
label=_('Mailing lists'), |
||||
widget=forms.CheckboxSelectMultiple()) |
||||
|
||||
def save(self, mailing_list): |
||||
data = self.cleaned_data |
||||
contact, created = Contact.objects.get_or_create( |
||||
email=data['email'], |
||||
defaults={'first_name': data['first_name'], |
||||
'last_name': data['last_name']}) |
||||
|
||||
for mailing_list in data['mailing_lists']: |
||||
mailing_list.subscribers.add(contact) |
||||
mailing_list.unsubscribers.remove(contact) |
||||
|
||||
|
||||
class ContactForm(forms.ModelForm): |
||||
email = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': _(u'Ваш e-mail')})) |
||||
first_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': _(u'Ваше имя')})) |
||||
class Meta: |
||||
model = Contact |
||||
fields = ('email', 'first_name', ) |
||||
|
||||
class ContactSettingsForm(forms.ModelForm): |
||||
theme = forms.MultipleChoiceField(choices=[(str(item.id), item.name) for item in list(Theme.objects.language().all())], |
||||
widget=forms.CheckboxSelectMultiple(attrs={'class': 'pr-checkbox'}), required=False) |
||||
class Meta: |
||||
model = ContactSettings |
||||
fields = ('exponent_practicum', 'organiser_practicum', 'theme') |
||||
|
||||
def clean_theme(self): |
||||
theme = self.cleaned_data.get('theme') |
||||
if theme: |
||||
return Theme.objects.filter(id__in=theme) |
||||
else: |
||||
return Theme.objects.none() |
||||
Binary file not shown.
@ -0,0 +1,856 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# <xaralis@centrum.cz>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-11-08 09:01+0000\n" |
||||
"Last-Translator: xaralis <xaralis@centrum.cz>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: cs\n" |
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Mailing listy" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Jméno" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Server" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Uživatelské jméno" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Pokud je server veřejný, ponechte prázdné." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Heslo" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Port" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Server používá TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "vlastní hlavičky" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"klíč1: hodnota1, klíč2: hodnota2, odděleno novým řádkem.\n" |
||||
"Užitečné pro trackovací hlavičky, pokud to umožňuje váš provider." |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "počet emailů za hodinu" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP server" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP servery" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "E-mail" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Křestní jméno" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Příjmení" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Odebíratel" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Platný e-mail" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Testovací kontakt" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tagy" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Datum vytvoření" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Datum úpravy" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Formát e-mailu" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "kontakt" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "kontakty" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Popis" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Odebíratelé" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Zrušené odběry" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Mailing list" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "mailing listy" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Návrh" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Čeká na odeslání" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Odesílá se" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Odesláno" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Zrušeno" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Titulek" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "V titulku můžete použít proměnnou \"{{ UNIQUE_KEY }}\"" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Obsah" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Nebo vložte URL." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "<body><!-- Zde upravte svůj newsletter --></body>" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Testovací kontakty" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "SMTP server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Odesílatel" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Odpovědět komu" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Stav" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Bude odesláno v" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Použito pro zobrazení newsletteru na stránkách." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "newslettery" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "URL" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "odkaz" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "odkaz" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "příloha" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "příloha" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "přílohy" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Odeslán testovací e-mail" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Při odesílání došlo k chybě" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "Neplatný e-mail" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Zobrazil e-mail" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Zobrazil e-mail na stránkách" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Odkaz otevřen" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "Zrušil odběr" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "Stav zasílání" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "Stav zasílání" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "Skupina oprávnění" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Pracovní skupina" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Pracovní skupiny" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Stav" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Pokročilé" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Žádný související objekt" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Související objekt" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Celkem přihlášek k odběru" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exportovat kontakty jako VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exportovat kontakty jako VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nový mailing list ze dne %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nový mailing list vytvořený v administraci dne %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s byl úspěšně vytvořen." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Vytvořit mailing list" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s kontaktů bylo úspěšně importováno." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importovat kontakty" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Prosím zvolte alespoň 2 mailing listy." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Sloučený mailing list z %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Mailing list vytvořený sloučením v %s." |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s byl úspěšně vytvořen sloučením." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Sloučit vybrané mailing listy." |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportovat odběratele" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Exportovat" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Příjemci" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Odesílání" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Další nastavení" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Výchozí" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Nelze stáhnout HTML kvůli interní chybě." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Prosím nainstalujte lxml pro parsování URL." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Zobrazit historii" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "v tuto chvíli nedostupné" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historie" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Zobrazit statistiky" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistiky" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Nelze odeslat newsletter kvůli interní HTML chybě." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s úspěšně odeslán." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "K %s nejsou přiřazeny žádné kontakty." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Odeslat testovací e-mail" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s newsletterů je připraveno k odeslání" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Změnit na \"připraveno k odeslání\"" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s newsletterů bylo zrušeno" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Zrušit odesílání" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Neplatná syntaxe, nezapomeňte na \":\"." |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Neplatná syntaxe: více přiřazení na řádku." |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Konfigurace" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Zkontrolovat připojení" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Počet kontaktů" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Počet mailing listů" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Počet newsletterů" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Přihlašovací formulář" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "Zobrazit popis" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Zobrazit popis mailing listu." |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Mailing list pro přihlášení." |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Přidat %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Akce" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importovat %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Přidat do mailing listu" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Exportovat %(name)s jako VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Exportovat %(name)s jako Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Domů" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Soubor Excelu (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Importovat kontakty z Excelu" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Sloupce jsou [email][příjmení][křestní jméno][tagy]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Všechny sloupce jsou volitelné kromě e-mailu." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Text" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Textový soubor (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importovat kontakty z textového souboru, nebo CSV." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
"Sloupce jsou [email][příjmení][křestní jméno][tagy] oddělené středníkem." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "Soubor elektronické vizitky VCard (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
"Importovat kontakty z vašeho oblíbeného mailového klienta poskytnutím " |
||||
"elektronické vizitky VCard." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "Prostý text" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Přihlášení do mailing listu" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Děkujeme za vaši prihlášku!" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Vyplňte tento formulář pro přihlášení do mailing listu." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Přiíhlásit se k odběru" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Odhlášení od odběru" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Jste odhlášen od odběru tohoto newsletteru." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Vyplňte tento formulář pro odhlášení od oběru." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Odhlásit se od odběru" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Administrátor" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Datu" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Kontakt" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Akce" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Pokud nevidíte tento e-mail" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "klikněte zde" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Pro odhlášení z tohoto mailing listu" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Histogram konzultací" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Období" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Statistiky" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Celkový počet zobrazení" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Počet zobrazení na webu" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Počet unikátních zobrazení" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Doručení nepotvrzeno" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Počet odhlášení od odběru" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Průměrný počet zobrazení" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Statistiky odkazů" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Počet kliků celkem" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Počet unikátních kliků na odkazy" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Počet kliků v poměru k otevření" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Počet kliků na odkazy průměrně" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Výkaz" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Stáhnout CSV výkaz" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Informace" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Příjemci" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Zobrazit" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Datum odeslání" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Testů odesláno" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Nejžhavější odkazy" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Mapa hustoty" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Informace nedostupné." |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Byl jste odhlášen od odběru." |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Mailing list vytvořený import v %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Kontakty importovány %s." |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistiky %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "počet zobrazení" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# zobrazení" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# kliků" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historie %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,856 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Marc Dierckx <marc.dierckx@eduthek.info>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-11-04 16:00+0000\n" |
||||
"Last-Translator: felarov <marc.dierckx@eduthek.info>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: de\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Verteilerliste" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Name" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Server Host" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Server Benutzer" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Leer lassen wenn Ihr Server öffentlich ist" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Server Passwort" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Server Port" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Server benutzt TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "Benutzerdefinierte Kopfzeile" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"key1: value1 key2: value2, splitted by return line.Useful for passing some " |
||||
"tracking headers if your provider allows it" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "Mails pro Stunde" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP-Server" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP-Server" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "E-Mail" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Vorname" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Nachname" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Abonnent" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "gültige E-Mail" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Kontaktversuchsperson" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tags" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Erstellungsdatum" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Geändert am" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Email Format" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "Kontakt" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "Kontakte" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Beschreibung" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Abonnenten" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Mit gekündigtem Abonnement" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Verteilerliste" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "Verteilerlisten" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Entwurf" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Warte bis Sendung" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Senden" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Gesendet" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Abgebrochen" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Titel" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Inhalt" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "oder kleb die URL" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "Editiere Ihre Newsletter hier" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Versuchskontakte" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Mail Server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Versender" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Antwort an" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Status" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Senddatum" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Newsletter Name auf der Seite" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "Newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "Newsletters" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "Url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "Link" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "Links" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "Datei hinzufügen" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "Datei anbei" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "D" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Versuchsversand" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Fehler" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "ungültige E-Mail" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Geöffnet" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Geöffnet auf der Seite" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Link geöffnet" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "Abonnement abbestellt" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "Versandstatus" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "Versandstatus" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "Berechtigungsgruppe" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Arbeitsgruppe" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Arbeitsgruppen" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Status" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Erweitert" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Keine relatives Objekt" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Verwantes Objekt" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Anzahl Abonnenten" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Kontakte als VCard exportieren" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Kontakte als VCard exportieren" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Neue Verteilerliste bei %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Neue Verteilerliste würde angelegt bei %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s erfolgreich angelegt" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Lege eine Verteilerliste an" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s Kontakte erfolgreich importiert" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Import" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "MIndestens 2 Verteilerlisten selektieren" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Verteilerliste als %s zusammenlegen" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Verteilerliste angelegt durch Zusammenlegen bei %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s erfolgreich angelegt durch Zusammenlegen" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Lege den selektierten Verteilerlisten zusammen" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportiere Abonnenten" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Export" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Empfänger" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Senden" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Sonstiges" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Standard" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Runterladen ist leider nicht möglich" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Python package lxml ist notwendig" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Historie" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Nicht verfügbar" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historie" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Statistiken ansehen" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistiken" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Versand nicht möglich wegen vorhandene HTML Fehler" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "Versand %s erfolgreich" |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Kein Versuchskontakt an %s zugeordnet" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Sende ein Versuchsmail" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s Newsletters sind fertig für Versand" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Änder Status in Fertig für Versand" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s Newsletters sind annuliert" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Abbrechen" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Ungültige Grammatik" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Ungültige Grammatik" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Konfiguration" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Verbindung ungültig" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Anzahl Kontakte" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Anzahl Verteilerlisten" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Anzahl Newsletters" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Abonnement abbestellen" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "Bescrhreibung" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Bescreibung der Verteilerliste" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Anzahl Verteilerlisten" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Füge %(name)s hinzu" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Aktion" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importiere %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Neue Verteilerliste" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Exportier Kontakte im VCard Format" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Exportiere %(name)s" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Startseite" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "EXCEL" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "EXCEL Datei (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Exportiere Kontakte als VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Verfügbare Kollome sind [email][last name][first name][tags]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Alle Kollome sind optional,ausser Email" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Tekst" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Tekst Datei (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importiere die Kontakte von einer Tekstdatei oder csv Datei" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
"Columns are [email][last name][first name][tags] getrennt durch Kommas" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "Vcard Datei (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "Importier Kontakte (VCard Datei)" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "Rohe Tekst" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Neue Verteilerliste" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Anzahl Teilnehmer" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Bestätig dieses Formular für eine erfolgreiche Abmeldung" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Teilnehmer" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Abmeldung" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Sie sind erfolgreich abgemeldet" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Bestätig dieses Formular für eine erfolgreiche Abmeldung" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Abonnement abbestellen" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Admin" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Datum" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Kontakt" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Aktion" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "When Sie dieses Mail nicht sehen," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "Klick hier" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Sie haben sich erfolgreich abgemeldet" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Histogram" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Periode" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Statistiken" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Anzahl Abonnenten" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Geöffnet auf der Webseite" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Gesammt einfache Öffnungen" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Lieferung unbekannt" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Abmeldung" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Anzahl Abonnenten" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Statistiken" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Anzahl Abonnenten" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Anzahl einfach angeklickte Links" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "angeklickte Links pro Versand" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Anzahl von Abonnenten" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Exportiere Zusammenfassung" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "CSV Zusammenfassung runterladen" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Empfänger" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Ansicht" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Versanndatum" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Versuche abgeschickt" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Top links" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Dichtheit" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Keine Top Links vorhanden" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Sie haben sich erfolgreich abgemeldet" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Verteilerliste wurde angelegt durch Zusammenfügen bei %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Import" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistiken von %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "Anzahl Teilnehmer" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "Anzahl Teilnehmer" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "\"val\" Klicks" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historie von %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,886 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. |
||||
# |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: PACKAGE VERSION\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2010-01-21 10:54+0100\n" |
||||
"Last-Translator: Fantomas <Fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
|
||||
#: forms.py:20 |
||||
#, fuzzy |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
#, fuzzy |
||||
msgid "Mailing lists" |
||||
msgstr "mailing lists" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Name" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Server host" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Server user" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Leave it empty if the host is public." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Server password" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Server port" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Server use TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "custom headers" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "mails per hour" |
||||
|
||||
#: models.py:93 |
||||
#, fuzzy |
||||
msgid "SMTP server" |
||||
msgstr "SMTP Server" |
||||
|
||||
#: models.py:94 |
||||
#, fuzzy |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP Servers" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "First name" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Last name" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Subscriber" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Valid email" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Contact tester" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tags" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Date of creation" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Date of modification" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Mail format" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contact" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contacts" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Description" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Subscribers" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Unsubscribers" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Mailing list" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "mailing lists" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Draft" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Waiting sending" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Sending" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Sent" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Canceled" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Title" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Content" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Or paste an URL." |
||||
|
||||
#: models.py:209 |
||||
#, fuzzy |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "Edit your newsletter here" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Test contacts" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Smtp server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Sender" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Reply to" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Status" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Sending date" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Used for displaying the newsletter on the site." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "newsletters" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "link" |
||||
|
||||
#: models.py:271 |
||||
#, fuzzy |
||||
msgid "links" |
||||
msgstr "link" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Sent in test" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Error" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "Invalid email" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Opened" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Opened on site" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Link opened" |
||||
|
||||
#: models.py:315 |
||||
#, fuzzy |
||||
msgid "unsubscription" |
||||
msgstr "Unsubscription" |
||||
|
||||
#: models.py:333 |
||||
#, fuzzy |
||||
msgid "contact mailing status" |
||||
msgstr "Mailing Status" |
||||
|
||||
#: models.py:334 |
||||
#, fuzzy |
||||
msgid "contact mailing statuses" |
||||
msgstr "Mailing Status" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "Permission group" |
||||
|
||||
#: models.py:353 |
||||
#, fuzzy |
||||
msgid "workgroup" |
||||
msgstr "Work Group" |
||||
|
||||
#: models.py:354 |
||||
#, fuzzy |
||||
msgid "workgroups" |
||||
msgstr "Work Groups" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Status" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Advanced" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "No relative object" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Related object" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Export contacts as VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
#, fuzzy |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Export contacts as VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "New mailing list at %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "New mailing list created in admin at %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s successfully created." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Create a mailing list" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contacts successfully imported." |
||||
|
||||
#: admin/contact.py:128 |
||||
#, fuzzy |
||||
msgid "Contact importation" |
||||
msgstr "Import" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Please select a least 2 mailing list." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Merging list at %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Mailing list created by merging at %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s successfully created by merging." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Merge selected mailing lists" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Export Subscribers" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Export" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Receivers" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Sending" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Miscellaneous" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Default" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Unable to download HTML, due to internal errors." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "View historic" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Not available" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historic" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "View statistics" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistics" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Unable to send the newsletter, due to internal HTML errors." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s successfully sent." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "No contact test assigned for %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Send email test" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s newsletters are ready to send" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Make it \"ready to send\"" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s newsletters are cancelled" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Cancel the sending" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configuration" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
#, fuzzy |
||||
msgid "Check connection" |
||||
msgstr "Connection valid" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Number of contacts" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Number of mailing List " |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Number of newsletter " |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
#, fuzzy |
||||
msgid "Subscription Form" |
||||
msgstr "Unsubscription" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
#, fuzzy |
||||
msgid "show description" |
||||
msgstr "Description" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
#, fuzzy |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Number of mailing List " |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Add %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
#, fuzzy |
||||
msgid "Actions" |
||||
msgstr "Action" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, fuzzy, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Import %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
#, fuzzy |
||||
msgid "Add to a mailing list" |
||||
msgstr "Create a mailing list" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, fuzzy, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Export contacts as VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, fuzzy, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Export %(name)s" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Home" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
#, fuzzy |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Export contacts as VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
#, fuzzy |
||||
msgid "Import" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
#, fuzzy |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Create a mailing list" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
#, fuzzy |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
#, fuzzy |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Validate this form to unsubscribe to this mailing list." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
#, fuzzy |
||||
msgid "Subscribe" |
||||
msgstr "Subscriber" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Unsubscription" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "You are unsubscribed to this mailing list." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Validate this form to unsubscribe to this mailing list." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Unsubscribe" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Admin" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Date" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Contact" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Action" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
#, fuzzy |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "You are unsubscribed to this mailing list." |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Consultation histogram" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Period" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
#, fuzzy |
||||
msgid "Broadcasting statistics" |
||||
msgstr "View statistics" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
#, fuzzy |
||||
msgid "Total openings" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
#, fuzzy |
||||
msgid "Openings on site" |
||||
msgstr "Opened on site" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Total single opening" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Unknown delivery" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
#, fuzzy |
||||
msgid "Unsubscriptions" |
||||
msgstr "Unsubscription" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
#, fuzzy |
||||
msgid "Openings average" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
#, fuzzy |
||||
msgid "Links statistics" |
||||
msgstr "View statistics" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
#, fuzzy |
||||
msgid "Total clicked links" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Total of single clicked links" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Clicked links per opening" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
#, fuzzy |
||||
msgid "Clicked links average" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Export Report" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Download CSV report" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
#, fuzzy |
||||
msgid "Informations" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
#, fuzzy |
||||
msgid "Recipients" |
||||
msgstr "Receivers" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "View" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
#, fuzzy |
||||
msgid "Sending date" |
||||
msgstr "Sending date" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Tests sent" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Top Links" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Density map" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "There is no Top links yet available" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
#, fuzzy |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "You are unsubscribed to this mailing list." |
||||
|
||||
#: utils/importation.py:52 |
||||
#, fuzzy, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Mailing list created by merging at %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, fuzzy, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Import" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistics of %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
#, fuzzy |
||||
msgid "openings" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: views/statistics.py:139 |
||||
#, fuzzy |
||||
msgid "#val# openings" |
||||
msgstr "Total Subscriptions" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historic of %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
Binary file not shown.
@ -0,0 +1,861 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# <ocholetrasaleatorias@gmail.com>, 2011. |
||||
# sergiodlc <sergiodlc+transifex@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: es\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Correo" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Listas de correo" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "nombre" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "dirección del servidor" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "usuario del servidor" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Dejar en blanco si el servidor es público" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "contraseña del servidor" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "puerto del servidor" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "el servidor utiliza TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "cabeceras personalizadas" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"clave1: valor1 clave2: valor2, separados por un salto de línea.\n" |
||||
"Sirve para pasar algunos encabezados de rastreo si tu proveedor los permite." |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "emails por hora" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "Servidor SMTP" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "Servidores SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "nombre" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "apellido" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "suscriptor" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "email válido" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "contacto de prueba" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "etiquetas" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "fecha de creación" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "fecha de modificación" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "formato de email" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contacto" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contactos" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "descripción" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "suscriptores" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "desuscritos" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "lista de correo" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "listas de correo" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "borrador" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "en cola para enviar" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "enviando" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "enviado" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "cancelado" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "título" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
"Puedes usar la variable \"{{ UNIQUE_KEY }} para identificar de forma única " |
||||
"el título del newsletter" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "contenido" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "O pega una URL." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "Edita tu newsletter aqui" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "probar contactos" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "servidor smtp" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "emisor" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "responder a" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "estado" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "fecha de envío" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Utilizado para mostrar el boletín de noticias en el sitio web." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "boletín de noticias" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "boletines de noticias" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "enlace" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "enlaces" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "archivo a adjuntar" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "adjunto" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "adjuntos" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "envío en prueba" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "error" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "email inválido" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "abierto" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "abierto en sitio web" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "enlace abierto" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "desuscripción" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "Estado del envío" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "Estado de los envíos" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "grupo de permisos" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Grupo de Trabajo" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Grupos de Trabajo" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Estado" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avanzado" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Sin objetos relacionados" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Objetos relacionados" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Suscriptores totales" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exportar contactos como VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exportar contactos a Excel" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nueva lista de correo en %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nueva lista de correo creada en %s utilizando la administración" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s creados con éxito." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Crear una lista de correo" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contactos importados satisfactoriamente." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "importar" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Por favor selecciona al menos 2 listas de correo." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Uniendo lista en %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Lista de correo creada al unir %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s creado exitosamente tras la unión." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Unir las listas de correo seleccionadas" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportar Suscriptores" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Exportar" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Receptores" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Enviando" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Miscelánea" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Por defecto" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Imposible descargar el HTML dado que contiene errores." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Por favor instala lxml para parsear una URL." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Ver Historial" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "No están disponibles" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historial" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Ver estadísticas" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Estadísticas" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
"Imposible enviar el boletin de noticias dado que el HTML contiene errores." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s enviado correctamente." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Sin contactos de prueba asignados a %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Enviar email de prueba" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s boletines de noticias listos para ser enviados" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Preparar para envío" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s boletines de noticias cancelados" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Cancelar el envío" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Sintax incorrecto, no te olvides los \":\"." |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Sintax incorrecto, demasiadas asignaciones por linea." |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configuración" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Probar conexión" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Número de Contactos" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Número de listas de correo" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Número de boletines de noticias" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Desuscripción" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "Descripción" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Ver descripción de la lista." |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Número de lista de mailing" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Añadir %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Acciones" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importar %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Añadir a la lista de correo" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Exportar %(name)s como VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Exportar %(name)s como Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Inicio" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Importación" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Archivo de Excel (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Exportar contactos como VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Las columnas son [email][last name][first name][tags]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Todas las columnas son opcionales excepto el correo." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Importar" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Texto" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Archivo de texto (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importar contactos desde un archivo de texto o desde un archivo CSV." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
"Las Columnas son [email][last name][first name][tags], separadas por un " |
||||
"punto y coma" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "Archivo VCard (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
"Importa contactos desde tu cliente de correo preferido, proveyendo un " |
||||
"archivo VCard." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Subscripción a la lista de correo" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Total de suscripciones" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Complete este formulario para suscribirse a la lista de correo." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Suscribirse" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Desuscripción" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Has sido desuscrito de la lista de correo." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Complete este formulario para desuscribirse de esta lista de correo." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Desuscribir" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Administración" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Fecha" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Contacto" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Acción" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Si no puedes ver este correo," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "pincha aqui" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Has sido desuscrito de la lista de correo." |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Histograma de consultas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Período" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Estadísticas de difusión" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Total abiertos" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Abierto en sitio web" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Total de los abiertos únicos" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Entregas no conocidas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Desuscripción" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Aperturas medias" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Estadísticas de enlaces" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Total de enlaces pulsados" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Total de enlaces únicos pulsados" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Enlaces pulsados por apertura" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Media de enlaces pulsados" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Informe" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Descargar el informe en CSV" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Informaciones" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Receptores" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Ver" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Fecha de envío" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Envio de prueba" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Principales enlaces" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Mapa de la densidad" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Ninguna tapa liga todavía." |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Has sido desuscrito de la lista de correo." |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Lista de correo creada uniendola con %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Estadísticas de %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "abiertos" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# abiertos" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# clicks" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historial de %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,851 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# <asinox@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: es_DO\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Correo Electrónico" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Listas de correos" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Nombre" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Servidor" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Usuario del servidor" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Déje en blanco si el servidor es público" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Contraseña del servidor" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Puerto del servidor" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "User servidor TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "Encabezados personalizados" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "Correos por hora" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "Servidor SMTP" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "Servidores SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Correo electrónico" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Nombre" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Apellido" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Suscribirse" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Email válido" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Probar contacto" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Etiquetas" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Fecha de creación" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Fecha de modificación" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Formato de correo" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "Contacto" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "Contactos" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Descripción" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Suscriptores" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Lista de correo" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "Listas de correos" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Borrador" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Esperando el envio" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Enviando" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Enviado" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Cancelado" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Título" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Contenido" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "O pegue una URL" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Prueba de contactos" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Servidor SMTP" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Remitente" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Responder a" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Estatus" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Fecha de envío" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Usado para mostrar el boletín en otro website" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "boletín" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "boletines" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "enlace" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "enlace" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "archivo para adjuntar" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "adjunto" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "adjuntos" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Pueba enviada" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Error" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "Correo electrónico inválido" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Abierto" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Abierto en el website" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Enlace abierto" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Grupo de trabajo" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Grupos de trabajo" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Estatus" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avanzado" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Sin objecto relacionado" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Objecto relacionado" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Total de suscriptores" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exportar contactos como VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exportar contactos como VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nueva lista de correo como %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Crear lista de correo" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importar" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Por favor seleccione por lo menos 2 listas de correo" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,851 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Gunleif Joensen <fo.umseting@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: fo\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "T-postur" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Postlistar" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Navn" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "ambætara vertur" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "ambætara brúkari" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Lat verða tómt, um verturin er almennur." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "ambætara atlát" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "ambætara portur" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "ambætarin nýtur TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "tillagað teksthøvd" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "t-postar um tíman" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP ambætari" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP ambætarir" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "t-postur" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "fornavn" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "eftirnavn" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "haldari" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "gildur t-postur" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "spjøldur" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "stovningardagur" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "broytingardagur" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "t-post snið" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "lýsing" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "haldarir" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "givnir haldarir" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "postlisti" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "postlistar" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "útkast" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "bíði sendi" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "sendi" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "sent" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "avlýst" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "heiti" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "innihald" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Ella set eina URLu inn." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "smtp ambætari" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "avsendari" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "aftursvara" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "støða" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "sendidagur" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Nýtt til at sýna tíðindaskrivið í staðnum." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "tíðindaskriv" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "tíðindaskriv" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "leinkja" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "leinkjur" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "fíla at viðfesta" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "viðfesti" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "viðfesti" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "villa" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "ógildigur t-postur" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "upplatin" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "arbeiðsbólkur" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "arbeiðsbólkar" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Standur" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Framkomið" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Eingin skyldur lutur" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Skyldir lutir" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Haldarir í alt" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Stovna ein postlista" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Flyt haldarar út" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Flyt út" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Móttakarir" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Sendi" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Ymiskt" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Forsett" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Sýn hagfrøði" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Hagfrøði" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Ikki før fyri at senda tíðindaskrivið, vegna villur inni í HTML." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s er væleydnað sent." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Senda royndar t-post" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s tíðindaskriv eru til reiðar at senda" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Gerð til reiðar at senda" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s tíðindaskriv eru avlýst" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Avlýs sendingina" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Samanseting" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Kanna sambinding" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Postlista-longd" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Longd á tíðindaskrivi" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Legg %(name)s til" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Atgerðir" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Flyt %(name)s inn" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Legg afturat einum postlista" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Flyt út %(name)s sum VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Flyt út %(name)s sum Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Heim" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Excel fíla (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Teigar eru [t-postur][eftirnavn][fornavn][spjældur]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Allir teigar eru sjálvbodnir, uttan t-postadressan." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Flyta inn" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Tekstur" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Tekstfíla (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "VCard fíla (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Takk fyri títt hald!" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Gerst haldari" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Gevst við haldi" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Tú er givin at halda hendan postlistan." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Gevst at halda" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Dato" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Atgerð" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Tíðarskeið" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Upplatingar í alt" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Upplatingar á staðnum" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Einskildar upplatingar í alt " |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Givnir haldarir" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Upplatingar í meðal" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Leinkju hagfrøði" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Frásøgn" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Tak CSV frásøgn niður" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Upplýsingar" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Móttakarir" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Sýn" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "sendidagur" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Royndir sendar" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,861 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Julien Fache <fantomas42@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-23 15:07+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: fr\n" |
||||
"Plural-Forms: nplurals=2; plural=(n > 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Listes de diffusion" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Nom" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Hôte" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Utilisateur" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Laissez ce champs vide, si aucune authentification n'est nécessaire." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Mot de passe" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Port" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Chiffrement TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "Entêtes personnalisées " |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"clef1: valeur1 clef2: valeur2, séparés par un retour à la ligne.\n" |
||||
"Utile pour passer des en-têtes de suivi si votre fournisseur le permet." |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "Envois/Heure" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "serveur SMTP" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "serveurs SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Prénom" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Nom" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Opt-in Newsletter" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Email valide" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Testeur" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tags" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Date de création" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Date de modification" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Contact" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contact" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contacts" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Description" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Inscrits" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Désinscrits" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Liste de diffusion" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "listes de diffusion" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Brouillon" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Prête à envoyer" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "En cours d'envois" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Envoyée" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Annulée" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Titre" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
"Vous pouvez utiliser la variable \"{{ UNIQUE_KEY }}\" pour avoir un " |
||||
"identifiant unique dans le titre de la newsletter." |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Contenu" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Ou collez simplement une URL." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
"<body>\n" |
||||
"<!-- Editez votre newsletter ici -->\n" |
||||
"</body>" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Contacts de test" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Serveur d'envois" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Expéditeur" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Répondre à" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Statut" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Date d'envois" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Utilisé pour construire le lien vers le site." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "Newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "newsletters" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "lien" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "liens" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "fichier à attacher" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "pièce jointe" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "pièces jointes" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Envois en test" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Erreur lors de l'envois" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "Email Invalide" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Réception OK" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Ouvert sur le site" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Lien ouvert" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "désabonnement" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "statut d'envoi" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "statuts d'envoi" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "groupe de permissions" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "groupe de travail" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "groupes de travail" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Statut" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avancé" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Pas de relations" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Objet relatif" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Abonnements" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exporter les contacts en VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exporter les contacts dans Excel" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nouvelle liste de diffusion du %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nouvelle de liste de diffusion créée depuis la table contact le %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s créée avec succès." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Créer une liste de diffusion" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contacts importés avec succès." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importation de contacts" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Veuillez sélectionner au moins 2 listes de diffusions." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Liste de diffusion fusionnée du %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Liste de diffusion créée par fusion le %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s créée avec succès." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Fusionner les listes de diffusions sélectionnées." |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Export des inscrits" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Exportation" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Destinataires" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Expédition" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Divers" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Par défault" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Impossible de télécharger le HTML, il contient des erreurs." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Veuillez installer lxml pour récupérer une URL." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Historique d'envois" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Non disponible" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historique" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Statistiques" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistiques" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Impossible d'envoyer la newsletter, le HTML est mal formaté." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s envoyée en test avec succès." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Pas de contacts de test assignés pour %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Effectuer un test d'envois" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s newsletters sont prêtes à être envoyées." |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Passer en attente d'expédition" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s newsletters ont été annulées." |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Annuler les envois" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Syntaxe invalide, n'oubliez pas les \":\"." |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Syntaxe invalide, plusieurs assignations par ligne." |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configuration" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Tester la connection" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Nombre de contacts" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Nombre de listes de diffusion" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Nombre de newsletters" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Formulaire d'abonnement" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "description visible" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Affiche la description de la liste de diffusion." |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Listes de diffusions disponible à l'abonnement." |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Ajouter %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Actions" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importer %(name)ss" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Ajouter à une liste de diffusion" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Exporter %(name)s en VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Exporter %(name)s dans Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Accueil" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Importation" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Fichier Excel (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Importez vos contacts depuis un fichier Excel." |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Les colonnes sont [email][prénom][nom][tags]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Toutes les colonnes sont optionnels à l'exception de l'email." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Importation" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Texte" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Fichier texte (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importez vos contacts depuis un fichier texte ou un fichier CSV." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
"Les colonnes sont [email][prénom][nom][tags], séparées par un point virgule." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "Fichier VCard (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
"Importez vos contacts depuis votre client mail favoris en fournissant un " |
||||
"fichier VCard." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "Texte brut" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Inscription aux listes de diffusions" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Merci pour votre inscription à la liste de diffusion !" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Validez ce formulaire pour vous inscrire aux listes de diffusion." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "S'inscrire" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Désabonnements" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Vous êtes désinscrit de cette liste de diffusion." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Validez ce formulaire pour vous désinscrire de la liste de diffusion." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Désinscription" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Admin." |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Date" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Contact" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Action" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Si vous ne pouvez voir cet e-mail," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "cliquez ici" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Pour vous désinscrire de cette liste de diffusion," |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Histogramme des consultations" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Période" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Statistiques de diffusion" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Ouvertures" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Ouvertures sur le site" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Destinataires ayant ouvert" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Réceptions inconnues" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Désabonnements" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Nombre moyen d'ouvertures" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Statistiques sur les liens" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Clics" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Destinataires ayant cliqué" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Taux de réactivité (clics/ouvertures)" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Nombre moyen de clics" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Rapport" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Télécharger le rapport CSV" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Informations" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Destinataires" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Voir" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Date d'envoi" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Envois en test" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Top Liens" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Carte de densité" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Pas de Top Liens pour l'instant." |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Vous êtes inscrit avec succès à cette liste de diffusion." |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Liste de diffusion créée par importation le %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Contacts importés par %s." |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistiques de %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "Ouvertures" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# ouvertures" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# clics" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historique de %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,854 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Denis Darii <sinednx@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: it\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "E-mail" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Elenchi email" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "nome" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "host" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "user" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Lascia vuoto se il server è pubblico" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "password" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "porta" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "utilizza TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "header personalizzati" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "mail all'ora" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "Server SMTP" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "Server SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "nome" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "cognome" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "sottoscrittore" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "email valida" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "contatto di prova" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "tag" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "data di creazione" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "data di modifica" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "formato messaggio" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contatto" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contatti" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "descrizione" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "sottoscrittori" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "sottoscrizione rimossa" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "lista di distribuzione" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "liste di distribuzione" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "bozza" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "in attesa di invio" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "invio in corso" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "inviata" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "annullata" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "titolo" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "contenuto" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Oppure incolla un URL." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "contatti di prova" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "server smtp" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "mittente" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "rispondi a" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "stato" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "data di invio" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Usato per mostrare la newsletter sul sito." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "newsletter" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "collegamento" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "collegamenti" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "file da allegare" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "allegato" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "allegati" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "inviata in prova" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "errore" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "email non valida" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "aperta" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "aperta sul sito" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "collegamento seguito" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "annullamento sottoscrizione" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "stato del contatto" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "stati del contatto" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "permessi del gruppo" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "gruppo di lavoro" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "gruppi di lavoro" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Stato" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avanzate" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Nessun oggetto correlato" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Oggetto correlato" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Sottoscrizioni totali" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Esporta i contatti come VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Esporta i contatti come Excel" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nuova lista di distribuzione per %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nuova lista di distribuzione creata in amministrazione per %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s creata con successo." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Crea una lista di distribuzione" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contatti importati con successo." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importazione contatti" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Seleziona almento 2 liste di distribuzione." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Unione delle liste per %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Lista di distribuzione creata per unione per %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s creata con successo per unione." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Unisci le liste di distribuzione selezionate" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Esporta i sottoscrittori" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Esporta" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Destinatari" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Invio in corso" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Varie" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Predefinito" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Impossibile scaricare l'HTML, a causa di errori nel codice." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Si prega di installare LXML per il parsing di URL." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Mostra storico" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Non disponibile" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Storico" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Mostra statistiche" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistiche" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Impossibile inviare la newsletter, per errori nel codice HTML." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s inviata con successo." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Nessun contatto assegnato a %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Invia email di test" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s newsletter sono pronte per l'invio" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Prepara per l'invio" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s newsletter sono annullate" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Annulla l'invio" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configurazione" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Verifica connessione" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Lunghezza contatti" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Lunghezza lista di distribuzione" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Lunghezza newsletter" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Modulo di abbonamento" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "mostra descrizione" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Mailing List per abbonarsi." |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Aggiungi %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Azioni" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importazione %(name)ss" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Aggiungi ad una lista" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Esporta %(name)s come VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Esporta %(name)s come Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Pagina iniziale" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Importazione" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "File excel (. xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Importa contatti da un file Excel." |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Importa" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Testo" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "File di testo (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "File VCard (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Abbonati alla mailing list" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Grazie per il vostro abbonamento!" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Convalida questo form per abbonarti alla mailing list." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Abbonati" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Annullamento sottoscrizione" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
"La tua sottoscrizione a questa lista di distribuzione è stata rimossa." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
"Conferma questo indirizzo per rimuovere la sottoscrizione a questa lista di " |
||||
"distribuzione." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Rimuovi la sottoscrizione" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Pagina iniziale" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Data" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Contatto" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Azione" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Se non riesci a vedere questa e-mail," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "clicca qui" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Per annullare l'iscrizione a questa mailing list," |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Grafico consultazione" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Periodo" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Statistiche di diffusione" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Totale aperture" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Aperture sul sito" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Totale aperture univoche" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Stato di recapito sconosciuto" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Annullamento sottoscrizioni" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Media aperture" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Statistiche collegamenti" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Totale collegamenti seguiti" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Totale collegamenti univoci seguiti " |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Collegamenti seguiti per apertura" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Media collegamenti seguiti" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Report" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Scarica report in CSV" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Informazioni" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Destinatari" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Mostra" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Data di invio" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Prove inviate" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Collegamenti popolari" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Mappa densità" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Nessun collegamento popolare." |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Ti sei iscritto correttamente alla mailing list!" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistiche di %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "aperture" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# aperture" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# click" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Storico di %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,850 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2010-11-30 00:55+0000\n" |
||||
"Last-Translator: Fantomas <Fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: ja\n" |
||||
"Plural-Forms: nplurals=1; plural=0\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,853 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Marc Dierckx <marc.dierckx@eduthek.info>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-11-05 09:20+0000\n" |
||||
"Last-Translator: felarov <marc.dierckx@eduthek.info>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: nl\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Mailing Lijst" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Naam" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Server host" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Server gebruiker" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Leeg laten voor een publieke host" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Server paswoord" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Server port" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Server gebruikt TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "Eigen headers" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "Mails per uur" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP Server" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP Servers" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Voornaam" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Familienaam" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Abonnent" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Geldig email" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Contact tester" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tags" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Creatiedatum" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Veranderingsdatum" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Mail formaat" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "Contact" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "Contacten" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Beschrijving" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Abonnenten" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Afgemeld" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Mailing lijst" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "Mailing lijsten" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Klad" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Wacht tot zending" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Zenden" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Gezonden" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Geannuleerd" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Titel" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Inhoud" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "of kleef een URL" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "Bewerk hier uw nieuwsbrief" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Testcontacten" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "smtp Server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Zender" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Antwoord aan" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Status" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Zenddatum" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Naam die wordt getoond op de website" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "nieuwsbrief" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "nieuwsbrieven" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "URL" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "link" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "link" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "file voor de annex" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "annex" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "annex" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "zend als test" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "fout" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "ongeldig email" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "geopend" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "geopend op de website" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "link geopend" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "afgemeld" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "mailing status" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "mailing status" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "groep met rechten" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "werkgroep" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "werkgroepen" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "status" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Gevorderd" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Geen relatief object" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Verwant object" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Totaal aantal abonnentenl " |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Contactpersonen exporteren als vCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Contactpersonen exporteren als vCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nieuwe mailing lijst op %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nieuwe mailinglijst gemaakt in admin at %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s met succes aangemaakt." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Maak een mailing lijst" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contacten met success geïmporteerd." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Import" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Selecteer ten minste 2 mailinglijsten." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Samenvoegen van de lijst op %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Mailing lijst gemaakt door het samenvoegen op %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s met succes aangemaakt door tesamenvoeging." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Tesamenvoegen van de geselecteerde mailinglijsten" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Export Abonnenten" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Export" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Ontvangers" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Verzenden" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Diversen" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Standaard" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Interne fouten tijdens het downloaden." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Bekijk de historiek" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Niet beschikbaar" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Historiek" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Bekijk de statistieken" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistiek" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "nterne HTML-fouten verhinderen de verzending" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s succesvol verstuurd." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Geen testcontact toegewezen voor %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Stuur e-mail-test" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s nieuwsbrieven zijn klaar om te verzenden" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Maak het \"klaar om te verzenden\"" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s nieuwsbrieven werden geannuleerd" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Annuleer de verzending" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configuratie" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Geldige verbinding" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Aantal contacten" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Aantal mailinglijsten" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Aantal nieuwsbrieven" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Uitschrijven" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "Beschrijving" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Beschrijving van de mailing lijst" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Aantal mailinglijsten" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Voeg %(name)s toe" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Actie" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Import %(name)s " |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Maak een mailing list" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Contactpersonen exporteren als vCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Export %(name)s " |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Startpagina" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Excel-bestand (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Contactpersonen exporteren als vCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Kolommen beschikbaar zijn [email] [achternaam] [voornaam] [tags]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Alle kolommen zijn optionaal behalve e-mail." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Tekst" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Tekstbestand (.txt,.csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Contactpersonen importeren uit een tekstbestand of een CSV-bestand." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
"Kolommen beschikbaar zijn [email] [achternaam] [voornaam] [tags], gesplitst " |
||||
"door een punt coma." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "VCard-bestand (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "Basis text" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Maak een mailing lijst" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Totaal Abonnementen" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Abonnent" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Uitschrijven" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Indien deze e-mail niet zichtbaar is," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "Klik hier" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Je bent van deze mailing lijst afgemeld." |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Je bent een lid van deze mailing lijst" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Mailing lijst gemaakt door het samenvoegen van %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Import" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "Totaal aantal abonnementen" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "Totaal aantal abonnementen" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# klikken" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Historiek van %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,850 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2010-11-30 00:55+0000\n" |
||||
"Last-Translator: Fantomas <Fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: pt\n" |
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,852 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Fábio <bnafta@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: pt_BR\n" |
||||
"Plural-Forms: nplurals=2; plural=(n > 1)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Nome" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Host do servidor" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Usuário do servidor" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Deixar vazio se o host é público." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Senha do servidor" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Porta do servidor" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Servidor usa TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "cabeçalhos personalizados" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "mensagens por hora" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "Servidor de SMTP" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "Servidores de SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Primeiro nome" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Sobrenome" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Assinante" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "E-mail válido" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Testador de contato" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tags" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Data de criação" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Data de modificação" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Formato de mensagem" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contato" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contatos" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Descrição" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Assinantes" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Rascunho" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Aguardando o envio" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Enviando" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Enviado" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Cancelado" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Título" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Conteúdo" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "Edite seu boletim informativo aqui" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Servidor SMTP" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Remetente" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Responder para" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Estado" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Data de envio" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Usado para exibir o boletim informativo no site." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "boletim informativo" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "boletins informativos" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "link" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "link" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "arquivo para anexar" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "anexo" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "anexos" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Enviado em teste" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Erro" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "E-mail inválido" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Aberto" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Link abriu" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "Grupo de permissões" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Grupo de Trabalho" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Grupos de Trabalho" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Estado" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avançado" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exportar contatos para formato VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exportar contatos para formato VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s criado com sucesso." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s contatos importados com êxito." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importar" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportar Assinantes" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Exportar" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Enviando" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Diversos" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Padrão" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Não é possível baixar HTML, devido a erros internos." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Por favor, instale lxml para analisar uma URL." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Visualizar histórico" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Não disponível" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Visualizar estatísticas" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Estatísticas" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
"Não foi possível enviar o boletim informativo, devido a erros HTML internos." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s enviado com sucesso." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Torná-lo \"pronto para enviar\"" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Cancelar o envio" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Configuração" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Conexão válida" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Número de contatos" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Número do boletim informativos" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "Descrição" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Adicionar %(name)s " |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Ação" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importar %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Início" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Importar" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Todas as colunas são opcionais com exceção da coluna e-mail." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Importar" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Texto" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Arquivo de texto (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importar contatos de um arquivo de texto ou um arquivo CSV." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Data" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Contato" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Ação" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "clique aqui" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Consultar Histograma" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Período" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Visualizar estatísticas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Visualizar estatísticas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Total de links clicados um única vez" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Exportar relatório" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Download relatório em CSV" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Importar" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Visualizar" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Data de envio" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Top Links" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Mapa de densidade" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Estatísticas de %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "Total de Assinaturas" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Histórico de %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,851 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Denis Darii <sinednx@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: ro\n" |
||||
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "E-mail" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Listele de corespondenţă" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "numele" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "server gazdă" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "utilizatorul serverului" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Lăsaţi-l gol în cazul în care hostul este public." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "parola server" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "poartă server" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "serverul folosește TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "antetele personalizate" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "mailuri pe oră" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP server" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "servere SMTP" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "e-mail" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "prenume" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "nume" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "abonat" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "email valid" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "contactează tester" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "tag-uri" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "data creării" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "data modificării" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "formatul emailului" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "contact" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "contacte" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "descriere" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "abonaţi" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "dez" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "listele de corespondenţă" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "draft" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "aşteptare trimiterea" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "trimitere" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "trimis" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "anulat" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "titlu" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "conţinut" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "smtp server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "expeditor" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "răspuns la" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "statutul" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "data trimiterii" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "buletin de ştiri" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "buletine de ştiri" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "link-ul" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "Link-uri" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "fişier de ataşat" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "ataşament" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "ataşamente" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "trimis în test" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "eroare" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "email nevalid" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "deschis" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "grupuri de lucru" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Status" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Avansat" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Total abonați" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Creaţi o lista de emailuri" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Importarea contactelor" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportați abonații" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Export" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Beneficiarii" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Trimitere" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Implicit" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Vezi istoric" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Istoric" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Vezi statistici" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistici" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,858 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Oleg Prans <yozapr@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: ru\n" |
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Е-мейл" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "Список рассылки" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "наименование" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "хост сервера" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "пользователь сервера" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Оставить незаполненным если хост публичный." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "пароль сервера" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "порт сервера" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "сервер использует TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "собственные заголовки" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"ключ1: значение1 ключ2: значение2, все с новой строки.\n" |
||||
"Используется для изменения хидеров, если ваш провайдер разрешает это." |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "мейлов в час" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP сервер" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP серверы" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "е-мейл" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "имя" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "фамилия" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "посписчик" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "валидный е-мейл" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "контакт тестер" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "тэги" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "дата создания" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "дата изменения" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "формат е-мейла" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "контакт" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "контакты" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "описание" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "подписчики" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "отказавшиеся от подписки" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "список рассылки" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "списки рассылки" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "черновик" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "ожидание отправки" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "отправка" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "отправлено" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "отменено" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "заголовок" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
"Вы можете использовать \"{{ UNIQUE_KEY }}\" переменную для уникальной " |
||||
"идентификации внутри заголовка рассылки новостей." |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "контент" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Или вставьте УРЛ." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
"<body>\n" |
||||
"<!-- Редактируйте ваш текст рассылки здесь -->\n" |
||||
"</body>" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "тестовые контакты" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "smtp сервер" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "отправитель" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "копия для" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "статус" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "дата отправки" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Используется для показа текста рассылки на сайте." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "текст рассылки" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "тексты рассылок" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "урл" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "линк" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "линки" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "прикрепленный файл" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "включение" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "включения" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "отпралено для теста" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "ошибка" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "неправильный е-мейл" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "открыт" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "открыт на сайте" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "линк открыт" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "отказ от подписки" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "статус отправки е-мейла подписчику" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "статусы отправок е-мейлов подписчикам" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "разрешения групп" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "рабочая группа" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "рабочие группы" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Статус" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Дополнительно" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Нет родительского объекта" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Родительский объект" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Всего подписок" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Экспорт контактов из VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Экспорт контактов из Excel" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Новый список рассыки на %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Новый список рассыки создан в админке на %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s успешно создано." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Создать список рассылки" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s контактов успешно импортировано." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Импорт контакта" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Пожалуйста выберите как минимум 2 списка рассылок." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Добавить список к %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Список рассылки добавлен к %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s успешно добавлен." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Добавить выбранные списки рассылок" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Экспорт подписчиков" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Экспорт" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Получатели" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Отправка" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Прочее" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "По-умолчанию" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Невозможно загрузить HTML, есть ошибки." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Пожалуйста установите lxml для парсинга урлов." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Посмотреть историю" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Недоступно" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "История" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Посмотреть статистику" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Статистика" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Невозможно отправить рассылку, есть ошибки HTML." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s успешно отправлено." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Нет тестовых контактов относящихся к %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Отпрака тестового е-мейла" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s рассылка готова к отправке" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Подготовить к отправке" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s рассылки отмененены" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Отмена отправки" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Неверный синтаксис, не забывайте использовать \":\"." |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Неверный синтаксис, несколько условий в строке" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Конфигурация" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Проверка подключения" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Количество контактов" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Количество списков рассылок" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Количество рассылок новостей" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Форма подписки" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "показ описания" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Содержание списка рассылки." |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "Список рассылки для подписки." |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Добавить %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Акции" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Импорт %(name)ss" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Добавить к списку рассылки" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Экспорт %(name)s как VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Экспорт %(name)s как Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Главная" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Импорт" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Excel файл (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Импорт контактов из Excel файла." |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Колонки [е-мейл][фамилия][имя][теги]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Колонки, кроме е-мейл, не обязательны." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Импорт" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Текст" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Текстовый файл (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Импорт контактов из текстового или CSV файлa." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "Колонки [е-мейл][фамиля][имя][теги] разделяются точкой с запятой." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "VCard файл (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "Импорт контактов из вашего е-мейл клиента, посредством VCard файла." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Подписка на е-мейл рассылку" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Спасибо за вашу подписку!" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Проверка этой формы для подписки на рассылку." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Подписка" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Отказ от подписки" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Ваш отказ от подписки на рассылку." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Проверка этой формы для отказа от подписки на рассылку." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Отказ от подписки" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Админ." |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Дата" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Контакт" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Акция" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Если вы не можете видеть этот е-мейл," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "кликните здесь" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "Для отказа от подписки на эту рассылку," |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Гистограмма" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Период" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Статистика публикаций" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Всего открыто" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Открыто на сайте" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Всего уникальных открытий" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Доставка по-умолчанию" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Отказы от подписки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Открывалось в среднем" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Линки статистики" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Всего кликов на линки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Всего уникальных кликов на линки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Клинкнуто открытых линков" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Кликнуто линков в среднем" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Отчет" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Загрузка CSV отчета" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Информация" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Пользователи" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Просмотр" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Дата рассылки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Тестовая рассылка" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Популярные линки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Карта нагрузки" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Пока непопулярные линки." |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Вы успешно подписались на е-мейл рассылку!" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "Список рассылки создан с помощью импорта %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Контакты импортированы из %s." |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Статистика %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "открыто" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# открыто" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# кликов" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "История %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,853 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# <matuskopo@yahoo.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: sk_SK\n" |
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "Email" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "zoznamy emailov" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "Názov" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "Adresa servera" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "Konto na serveri" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Nechajte prázdne, ak je server verejný." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "Heslo" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "Port servera" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "Server používa TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "vlastné hlavičky" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "maily za hodinu" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP Server" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP Servery" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "Email" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "Krstné meno" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "Priezvisko" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "Odberateľ" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "Platný email" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "Testovací kontakt" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "Tagy" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "Dátum vytvorenia" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "Dátum zmeny" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "Formát mailu" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "kontakt" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "kontakty" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "Popis" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "Odberatelia" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "Ex-odberatelia" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "Zoznam emailov" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "zoznamy emailov" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "Koncept" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "Čaká na odoslanie" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "Posiela sa" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "Odoslaný" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "Zrušený" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "Názov" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "Obsah" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Alebo vložte URL" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "Testovacie kontakty" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "Smtp server" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "Odosielateľ" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "Odpovedať na" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "Stav" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "Dátum odoslania" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Používa sa na zobrazenie newslettera na stránke." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "newsletter" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "newsletters" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "odkaz" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "odkaz" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "súbor na priloženie" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "príloha" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "prílohy" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "Odoslané v teste" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "Chyba" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "Nesprávny email" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "Otvorený" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "Otvorený na stránke" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "Odkaz otvorený" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "Odhlásenie" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "Stav korešpondencie" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "Stav korešpondencie" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "Skupina oprávnení" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Pracovná skupina" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "Pracovné skupiny" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Stav" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Pokročilý" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Žiaden súvisiaci objekt" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Súvisiaci objekt" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Odberateľov celkom" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Exportovať kontakty ako VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Exportovať kontakty ako VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nový zoznam emailov pre %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nový zoznam emailov vytvorená v administrácii %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s úspešne vytvorený." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Vytvoriť zoznam emailov" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s kontaktov úspešne importovaných." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Import" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Prosím zvoľte aspoň 2 zoznamy emailov." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Zlučujem zoznam na %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "Zoznam emailov vytvorený zlúčením na %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s úspešne vytvorený zlúčením." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Zlúčiť vybrané zoznamy emailov" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Exportovať odberateľov" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Export" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Príjemcovia" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Odosielanie" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Rôzne" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Základné" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "Nie je možné stiahnuť HTML, kvôli interným chybám." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Pozrieť históriu" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Nie je k dispozícii" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "História" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Pozrieť štatistiky" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Štatistiky" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Nie je možné odoslať newsletter, kvôli interným chybám." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s úspešne odoslané." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Nebol priradený žiaden testovací kontakt ku %s" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Poslať testovací email" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s newletterov je pripravených na odoslanie" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Nastaviť \"pripravené na odoslanie\"" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s newsletterov zrušených" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Zrušit odosielanie" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Nastavenia" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Pripojenie funguje" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Počet kontaktov" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Počet zoznamov emailov" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Počet newsletterov" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Pridať %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Akcia" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Importovať %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Vytvoriť zoznam mailov" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Exportovať %(name)s ako VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Exportovať %(name)s ako Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Úvod" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Excel súbor (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Exportovať kontakty ako VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Stĺpce sú [email][priezvisko][meno][tagy]" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Všetky stĺpce sú nepovinné okrem emailu." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Import" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Text" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Textový súbor (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Importovať kontakty z textového alebo CSV súboru." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "Stĺpce sú [email][priezvisko][meno][tagy], oddelené bodkočiarkou." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "VCard súbor (.csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "" |
||||
"Importovať kontakty z Vášho obľúbeného emailového klienta použitím VCard " |
||||
"súboru." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Vytvoriť zoznam mailov" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Spolu odberateľov" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Overte tento formulár pre odstránenie odberateľa zo zoznamu." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Odberateľ" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Odhlásenie z odoberania" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Boli ste odhlásený z odoberania." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Overte tento formulár pre odstránenie odberateľa zo zoznamu." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Odhlásiť odoberanie" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Admin" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Dátum" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Kontakt" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Akcia" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Zobraziť štatistiky" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Spolu odberateľov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Otvorené na stránke" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Jednotlivé otvorenia celkovo" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Neznáme doručenie" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Odhlásenie z odoberania" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Spolu odberateľov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Zobraziť štatistiky" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Spolu odberateľov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,856 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# Primož Verdnik <primoz.verdnik@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: sl\n" |
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "E-pošta" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "E-poštni seznami" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "ime" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "naslov strežnika" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "uporabniško ime" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "Pustite prazno, če je strežnik javni." |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "geslo strežnika" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "vrata strežnika" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "server uporablja TLS" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "glava po meri" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "" |
||||
"ključ1: vrednost1 ključ2: vrednost2, ločeno z novo vrstico.\n" |
||||
"Uporabno za podajanje nekaterih sledilnih podatkov, če to vaš ponudnik omogoča." |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "število e-poštnih sporočil na uro" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "SMTP strežnik" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "SMTP strežniki" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "e-pošta" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "ime" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "priimek" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "naročnik" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "veljavni e-poštni naslov" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "testni kontakt" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "značke" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "ustvarjeno" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "spremenjeno" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "format e-poštnega sporočila" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "kontakt" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "kontakti" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "opis" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "naročniki" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "nenaročniki" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "e-poštni seznam" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "e-poštni seznami" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "osnutek" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "pošiljanje na čakanju" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "pošiljanje v teku" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "poslano" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "preklicano" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "naslov" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "" |
||||
"Za unikatne identifikatorje znotraj naslova lahk uporabite spremenljivko " |
||||
"\"{{ UNIQUE_KEY }}\"." |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "vsebina" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "Ali prilepite URL." |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "uredite svoje glasilo tukaj" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "testni kontakt" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "smtp strežnik" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "pošiljatelj" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "naslov za odgovor" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "stanje" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "datum pošiljanja" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "Se uporablja za prikaz glasila na spletni strani." |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "glasilo" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "glasila" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "url" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "povezava" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "povezava" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "datoteka za pripenjanje" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "priponka" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "priponke" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "poslano v sklopu testa" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "napaka" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "neveljavna e-pošta" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "odprto" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "odprto na strani" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "povezava obiskana" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "odjava" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "stanje pošiljanja za kontakt" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "stanje pošiljanja za kontakte" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "skupina s pravicami" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "Delovna skupina" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "delovne skupine" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "Status" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "Napredno" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "Ni povezanega objekta" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "Povezan objekt" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "Vseh naročnikov" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "Izvozi kontakte kot VCard" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "Izvozi kontakte kot VCard" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "Nov e-poštni seznam na %s" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "Nov e-poštni seznam ustvarjen v admin ob %s" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s uspešno ustvarjen." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "Naredi e-poštni seznam" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s kontaktov uspešno uvoženih." |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "Uvozi" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "Prosim izberite vsaj 2 e-poštna seznama." |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "Spajam seznam na %s" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "E-poštni seznam ustvarjen s spajanjem na %s" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s uspešno ustvarjen s spajanjem." |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "Spoji izbrane e-poštne sezname" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "Izvozi naročnike" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "Izvozi" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "Prejemniki" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "Pošiljanje" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "Razno" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "Privzeto" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "HTML-ja ni bilo moč presneti, zaradi interne napake." |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "Prosim namestite lxml za parsanje URLjev." |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "Poglej zgodovino" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "Ni na voljo" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "Zgodovina" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "Poglej statistiko" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "Statistika" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "Glasila ni bilo moč poslati, zaradi notranjih HTML napak." |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s uspešno poslan." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "Noben testni račun ni dodeljen %s." |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "Pošlji testno e-pošto" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s glasil je pripravljenih na pošiljanje" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "Pripravi za pošiljanje" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s glasil je preklicanih" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "Prekliči pošiljanje" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "Neveljavna sintaksa, ne pozabite na \":\"." |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "Neveljavna sintaksa, preveč dodelitev na vrstico." |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "Konfiguracija" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "Preveri povezavo" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "Dolžina kontaktov" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "Dolžina e-poštnega seznama" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "Dolžina glasila" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "Naročnina na e-poštni seznam" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "prikaži opis" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "Prikaži opis e-poštnega seznama." |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "E-poštni seznam." |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "Dodaj %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "Akcije" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "Uvozi %(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "Ustvari e-poštni seznam" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "Izvozi %(name)s kot VCard" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "Izvozi %(name)s kot Excelovo datoteko" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "Domov" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "Uvoz" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "Datoteka Excel (.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "Uvozi kontakte iz Excelove datoteke." |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "Stoplci so [e-pošta][priimek][ime][značke]." |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "Noben stolpec razen e-pošte ni obvezen." |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "Uvozi" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "Besedil" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "Datoteka z besedilom (.txt, .csv)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "Uvozi kontakte iz datoteke z besedilom ali datoteke tipa CSV." |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "Stoplci so [e-pošta][priimek][ime][značke], ločeni s podpičjem." |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "Vcard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "Datoteka tipa VCard (.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "Uvozi kontakte iz e-poštnega programa, s pomočjo datoteke tipa VCard." |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "Ustvari e-poštni seznam" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "Hvala za prijavo!" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "Potrdite odjavo iz tega e-poštnega seznama." |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "Naroči se" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "Odjava iz e-poštnega seznama" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "Iz tega e-poštnega seznama ste odjavljeni." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "Potrdite odjavo iz tega e-poštnega seznama." |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "Odjavi se" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "Admin" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "Datum" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "Kontakt" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "Akcija" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "Če te e-pošte ne morete videti," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "kliknite tukaj" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "" |
||||
"Za odjavo iz tega e-poštnega seznama,Za odjavo iz tega e-poštnega seznama" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "Informativni histogram" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "Obdobje" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "Statistika pošiljanja" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "Vseh pogledov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "Odprto na strani" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "Skupaj posameznih ogledov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "Podatek o dostavi neznan" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "Odjava naročnine" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "Povprečno pogledov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "Statistika povezav" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "Vseh klikanih povezav" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "Skupno število enkrat obiskanih povezav" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "Obiskanih povezav med ogledom" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "Povprečje klikanih povezav" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "Poročilo" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "Presnami poročilo CSV" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "Imformacije" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "Prejemniki" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "Poglej" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "Datum pošiljanja" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "Poslanih testov" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "Naj povezave" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "Mapa gostote" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "Zaenkrat naj povezav ni na voljo" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "Na ta e-poštni seznam niste več naročeni." |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "E-poštni seznam ustvarjen s spajanjem na %s" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "Kontakte uvozil %s." |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "Statistika %s" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "pogledov" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "#val# pogledov" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "#val# klikov" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "Zgodovina %s" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
Binary file not shown.
@ -0,0 +1,851 @@ |
||||
# SOME DESCRIPTIVE TITLE. |
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER |
||||
# This file is distributed under the same license as the PACKAGE package. |
||||
# |
||||
# Translators: |
||||
# aaffdd11 <chenyuan328@gmail.com>, 2011. |
||||
msgid "" |
||||
msgstr "" |
||||
"Project-Id-Version: Emencia Django Newsletter\n" |
||||
"Report-Msgid-Bugs-To: \n" |
||||
"POT-Creation-Date: 2011-09-22 06:00-0500\n" |
||||
"PO-Revision-Date: 2011-09-22 11:01+0000\n" |
||||
"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n" |
||||
"Language-Team: LANGUAGE <LL@li.org>\n" |
||||
"MIME-Version: 1.0\n" |
||||
"Content-Type: text/plain; charset=UTF-8\n" |
||||
"Content-Transfer-Encoding: 8bit\n" |
||||
"Language: zh_CN\n" |
||||
"Plural-Forms: nplurals=1; plural=0\n" |
||||
|
||||
#: forms.py:20 |
||||
msgid "Email" |
||||
msgstr "电子邮件" |
||||
|
||||
#: forms.py:44 |
||||
msgid "Mailing lists" |
||||
msgstr "邮件表" |
||||
|
||||
#: models.py:39 models.py:156 models.py:339 |
||||
msgid "name" |
||||
msgstr "姓名" |
||||
|
||||
#: models.py:40 |
||||
msgid "server host" |
||||
msgstr "服务器主机" |
||||
|
||||
#: models.py:41 |
||||
msgid "server user" |
||||
msgstr "服务器用户" |
||||
|
||||
#: models.py:42 models.py:44 |
||||
msgid "Leave it empty if the host is public." |
||||
msgstr "如果主机是公用的则清空" |
||||
|
||||
#: models.py:43 |
||||
msgid "server password" |
||||
msgstr "服务器密码" |
||||
|
||||
#: models.py:45 |
||||
msgid "server port" |
||||
msgstr "服务器端口" |
||||
|
||||
#: models.py:46 |
||||
msgid "server use TLS" |
||||
msgstr "服务器使用的传输层协议" |
||||
|
||||
#: models.py:48 |
||||
msgid "custom headers" |
||||
msgstr "自定义页头" |
||||
|
||||
#: models.py:49 |
||||
msgid "" |
||||
"key1: value1 key2: value2, splitted by return line.\n" |
||||
"Useful for passing some tracking headers if your provider allows it." |
||||
msgstr "键1:值1 键2:值2,通过换行分隔。提供商允许的话可以用于传递一些有用的跟踪头。" |
||||
|
||||
#: models.py:51 |
||||
msgid "mails per hour" |
||||
msgstr "每小时邮件数" |
||||
|
||||
#: models.py:93 |
||||
msgid "SMTP server" |
||||
msgstr "电子邮件传输服务器" |
||||
|
||||
#: models.py:94 |
||||
msgid "SMTP servers" |
||||
msgstr "电子邮件传输服务器群" |
||||
|
||||
#: models.py:99 views/statistics.py:76 |
||||
msgid "email" |
||||
msgstr "电子邮件" |
||||
|
||||
#: models.py:100 views/statistics.py:75 |
||||
msgid "first name" |
||||
msgstr "名" |
||||
|
||||
#: models.py:101 views/statistics.py:75 |
||||
msgid "last name" |
||||
msgstr "姓" |
||||
|
||||
#: models.py:103 |
||||
msgid "subscriber" |
||||
msgstr "用户" |
||||
|
||||
#: models.py:104 |
||||
msgid "valid email" |
||||
msgstr "有效的电子邮件" |
||||
|
||||
#: models.py:105 |
||||
msgid "contact tester" |
||||
msgstr "接触试验" |
||||
|
||||
#: models.py:106 |
||||
msgid "tags" |
||||
msgstr "标记" |
||||
|
||||
#: models.py:112 models.py:165 models.py:227 models.py:260 models.py:324 |
||||
msgid "creation date" |
||||
msgstr "建立日期" |
||||
|
||||
#: models.py:113 models.py:166 models.py:228 |
||||
msgid "modification date" |
||||
msgstr "更改日期" |
||||
|
||||
#: models.py:132 |
||||
msgid "mail format" |
||||
msgstr "邮件格式" |
||||
|
||||
#: models.py:150 models.py:319 |
||||
msgid "contact" |
||||
msgstr "联系" |
||||
|
||||
#: models.py:151 models.py:342 |
||||
msgid "contacts" |
||||
msgstr "联系" |
||||
|
||||
#: models.py:157 |
||||
msgid "description" |
||||
msgstr "描述" |
||||
|
||||
#: models.py:159 models.py:170 |
||||
msgid "subscribers" |
||||
msgstr "订购" |
||||
|
||||
#: models.py:161 models.py:174 |
||||
msgid "unsubscribers" |
||||
msgstr "无效订购" |
||||
|
||||
#: models.py:186 models.py:211 cmsplugin_newsletter/models.py:15 |
||||
msgid "mailing list" |
||||
msgstr "邮件清单" |
||||
|
||||
#: models.py:187 models.py:344 |
||||
msgid "mailing lists" |
||||
msgstr "邮件表" |
||||
|
||||
#: models.py:198 |
||||
msgid "draft" |
||||
msgstr "草稿" |
||||
|
||||
#: models.py:199 |
||||
msgid "waiting sending" |
||||
msgstr "正在等待发送" |
||||
|
||||
#: models.py:200 |
||||
msgid "sending" |
||||
msgstr "正在发送" |
||||
|
||||
#: models.py:201 models.py:309 |
||||
msgid "sent" |
||||
msgstr "已发送" |
||||
|
||||
#: models.py:202 |
||||
msgid "canceled" |
||||
msgstr "已取消" |
||||
|
||||
#: models.py:205 models.py:257 models.py:282 cmsplugin_newsletter/models.py:12 |
||||
msgid "title" |
||||
msgstr "标题" |
||||
|
||||
#: models.py:206 |
||||
msgid "" |
||||
"You can use the \"{{ UNIQUE_KEY }}\" variable for unique identifier within " |
||||
"the newsletter's title." |
||||
msgstr "你可以在简讯标题种使用{{UNIQUE_KEY}}来确保唯一性。" |
||||
|
||||
#: models.py:208 |
||||
msgid "content" |
||||
msgstr "内容" |
||||
|
||||
#: models.py:208 |
||||
msgid "Or paste an URL." |
||||
msgstr "或粘帖一个互联网地址" |
||||
|
||||
#: models.py:209 |
||||
msgid "" |
||||
"<body>\n" |
||||
"<!-- Edit your newsletter here -->\n" |
||||
"</body>" |
||||
msgstr "在这里编辑您的简讯" |
||||
|
||||
#: models.py:212 |
||||
msgid "test contacts" |
||||
msgstr "测试接触" |
||||
|
||||
#: models.py:215 |
||||
msgid "smtp server" |
||||
msgstr "邮件传输协议服务" |
||||
|
||||
#: models.py:217 |
||||
msgid "sender" |
||||
msgstr "发送人" |
||||
|
||||
#: models.py:219 |
||||
msgid "reply to" |
||||
msgstr "回复" |
||||
|
||||
#: models.py:222 models.py:320 |
||||
msgid "status" |
||||
msgstr "状态" |
||||
|
||||
#: models.py:223 |
||||
msgid "sending date" |
||||
msgstr "发送日期" |
||||
|
||||
#: models.py:225 |
||||
msgid "Used for displaying the newsletter on the site." |
||||
msgstr "用于在这个位置显示简报" |
||||
|
||||
#: models.py:250 models.py:281 models.py:318 |
||||
#: cmsplugin_newsletter/cms_plugins.py:13 |
||||
msgid "newsletter" |
||||
msgstr "通迅;简报" |
||||
|
||||
#: models.py:251 models.py:346 |
||||
msgid "newsletters" |
||||
msgstr "通迅;简报" |
||||
|
||||
#: models.py:258 |
||||
msgid "url" |
||||
msgstr "互联网地址" |
||||
|
||||
#: models.py:270 models.py:321 |
||||
msgid "link" |
||||
msgstr "连接" |
||||
|
||||
#: models.py:271 |
||||
msgid "links" |
||||
msgstr "链接" |
||||
|
||||
#: models.py:283 |
||||
msgid "file to attach" |
||||
msgstr "附上文件" |
||||
|
||||
#: models.py:287 |
||||
msgid "attachment" |
||||
msgstr "附件" |
||||
|
||||
#: models.py:288 |
||||
msgid "attachments" |
||||
msgstr "附件" |
||||
|
||||
#: models.py:308 |
||||
msgid "sent in test" |
||||
msgstr "发送试验" |
||||
|
||||
#: models.py:310 |
||||
msgid "error" |
||||
msgstr "错误" |
||||
|
||||
#: models.py:311 |
||||
msgid "invalid email" |
||||
msgstr "无效邮件" |
||||
|
||||
#: models.py:312 |
||||
msgid "opened" |
||||
msgstr "已打开的" |
||||
|
||||
#: models.py:313 |
||||
msgid "opened on site" |
||||
msgstr "访问于" |
||||
|
||||
#: models.py:314 |
||||
msgid "link opened" |
||||
msgstr "打开的链接" |
||||
|
||||
#: models.py:315 |
||||
msgid "unsubscription" |
||||
msgstr "取消订阅" |
||||
|
||||
#: models.py:333 |
||||
msgid "contact mailing status" |
||||
msgstr "邮件状态" |
||||
|
||||
#: models.py:334 |
||||
msgid "contact mailing statuses" |
||||
msgstr "邮件状态" |
||||
|
||||
#: models.py:340 |
||||
msgid "permissions group" |
||||
msgstr "权限组" |
||||
|
||||
#: models.py:353 |
||||
msgid "workgroup" |
||||
msgstr "工作组" |
||||
|
||||
#: models.py:354 |
||||
msgid "workgroups" |
||||
msgstr "工作组" |
||||
|
||||
#: admin/contact.py:36 templates/newsletter/newsletter_statistics.html:188 |
||||
msgid "Status" |
||||
msgstr "状态" |
||||
|
||||
#: admin/contact.py:37 |
||||
msgid "Advanced" |
||||
msgstr "高级的" |
||||
|
||||
#: admin/contact.py:69 |
||||
msgid "No relative object" |
||||
msgstr "没有相关对象" |
||||
|
||||
#: admin/contact.py:71 |
||||
msgid "Related object" |
||||
msgstr "相关对象" |
||||
|
||||
#: admin/contact.py:78 |
||||
msgid "Total subscriptions" |
||||
msgstr "总订阅数" |
||||
|
||||
#: admin/contact.py:83 |
||||
msgid "Export contacts as VCard" |
||||
msgstr "以VCard导出联系人" |
||||
|
||||
#: admin/contact.py:90 |
||||
msgid "Export contacts in Excel" |
||||
msgstr "以VCard导出联系人" |
||||
|
||||
#: admin/contact.py:95 |
||||
#, python-format |
||||
msgid "New mailinglist at %s" |
||||
msgstr "于%s创建的新邮件列表" |
||||
|
||||
#: admin/contact.py:96 |
||||
#, python-format |
||||
msgid "New mailing list created in admin at %s" |
||||
msgstr "于%s创建的新邮件列表" |
||||
|
||||
#: admin/contact.py:104 |
||||
#, python-format |
||||
msgid "%s succesfully created." |
||||
msgstr "%s发送成功." |
||||
|
||||
#: admin/contact.py:107 |
||||
msgid "Create a mailinglist" |
||||
msgstr "创建一个邮件列表" |
||||
|
||||
#: admin/contact.py:126 |
||||
#, python-format |
||||
msgid "%s contacts succesfully imported." |
||||
msgstr "%s联系人成功导入。" |
||||
|
||||
#: admin/contact.py:128 |
||||
msgid "Contact importation" |
||||
msgstr "导入" |
||||
|
||||
#: admin/mailinglist.py:65 |
||||
msgid "Please select a least 2 mailing list." |
||||
msgstr "请至少选择2个邮件列表。" |
||||
|
||||
#: admin/mailinglist.py:77 |
||||
#, python-format |
||||
msgid "Merging list at %s" |
||||
msgstr "于%s创建的合并列表" |
||||
|
||||
#: admin/mailinglist.py:78 |
||||
#, python-format |
||||
msgid "Mailing list created by merging at %s" |
||||
msgstr "于%s合并创建的邮件列表" |
||||
|
||||
#: admin/mailinglist.py:87 |
||||
#, python-format |
||||
msgid "%s succesfully created by merging." |
||||
msgstr "%s创建成功" |
||||
|
||||
#: admin/mailinglist.py:90 |
||||
msgid "Merge selected mailinglists" |
||||
msgstr "选择合并的邮件列表" |
||||
|
||||
#: admin/mailinglist.py:96 |
||||
msgid "Export Subscribers" |
||||
msgstr "导出订阅人" |
||||
|
||||
#: admin/mailinglist.py:98 |
||||
msgid "Export" |
||||
msgstr "导出" |
||||
|
||||
#: admin/newsletter.py:41 |
||||
msgid "Receivers" |
||||
msgstr "接收人" |
||||
|
||||
#: admin/newsletter.py:42 |
||||
msgid "Sending" |
||||
msgstr "正在发送" |
||||
|
||||
#: admin/newsletter.py:43 admin/smtpserver.py:36 |
||||
msgid "Miscellaneous" |
||||
msgstr "杂项" |
||||
|
||||
#: admin/newsletter.py:79 |
||||
msgid "Default" |
||||
msgstr "默认" |
||||
|
||||
#: admin/newsletter.py:106 |
||||
msgid "Unable to download HTML, due to errors within." |
||||
msgstr "由于内部HTML错误无法发送的新闻" |
||||
|
||||
#: admin/newsletter.py:108 |
||||
msgid "Please install lxml for parsing an URL." |
||||
msgstr "请安装用于解析URL的lxml。" |
||||
|
||||
#: admin/newsletter.py:120 |
||||
msgid "View historic" |
||||
msgstr "查看历史" |
||||
|
||||
#: admin/newsletter.py:121 admin/newsletter.py:130 |
||||
msgid "Not available" |
||||
msgstr "不可用" |
||||
|
||||
#: admin/newsletter.py:123 |
||||
msgid "Historic" |
||||
msgstr "历史" |
||||
|
||||
#: admin/newsletter.py:129 |
||||
msgid "View statistics" |
||||
msgstr "查看统计" |
||||
|
||||
#: admin/newsletter.py:132 |
||||
msgid "Statistics" |
||||
msgstr "统计" |
||||
|
||||
#: admin/newsletter.py:142 |
||||
msgid "Unable send newsletter, due to errors within HTML." |
||||
msgstr "由于内部HTML错误无法发送的新闻。" |
||||
|
||||
#: admin/newsletter.py:144 |
||||
#, python-format |
||||
msgid "%s succesfully sent." |
||||
msgstr "%s发送成功." |
||||
|
||||
#: admin/newsletter.py:146 |
||||
#, python-format |
||||
msgid "No test contacts assigned for %s." |
||||
msgstr "%s没有测试人。" |
||||
|
||||
#: admin/newsletter.py:147 |
||||
msgid "Send test email" |
||||
msgstr "发送邮件测试" |
||||
|
||||
#: admin/newsletter.py:155 |
||||
#, python-format |
||||
msgid "%s newletters are ready to send" |
||||
msgstr "%s简讯已准备好发送" |
||||
|
||||
#: admin/newsletter.py:156 |
||||
msgid "Make ready to send" |
||||
msgstr "设为“准备发送”" |
||||
|
||||
#: admin/newsletter.py:165 |
||||
#, python-format |
||||
msgid "%s newletters are cancelled" |
||||
msgstr "%s通讯被取消" |
||||
|
||||
#: admin/newsletter.py:166 |
||||
msgid "Cancel the sending" |
||||
msgstr "取消发送" |
||||
|
||||
#: admin/smtpserver.py:18 |
||||
msgid "Invalid syntax, do not forget the \":\"." |
||||
msgstr "无效的语法,不要忘了“:”。" |
||||
|
||||
#: admin/smtpserver.py:20 |
||||
msgid "Invalid syntax, several assignments by line." |
||||
msgstr "无效的语法,一行有太多的赋值。" |
||||
|
||||
#: admin/smtpserver.py:34 |
||||
msgid "Configuration" |
||||
msgstr "配置" |
||||
|
||||
#: admin/smtpserver.py:57 |
||||
msgid "Check connection" |
||||
msgstr "有效的连接" |
||||
|
||||
#: admin/workgroup.py:18 |
||||
msgid "Contacts length" |
||||
msgstr "联系人数量" |
||||
|
||||
#: admin/workgroup.py:22 |
||||
msgid "Mailing List length" |
||||
msgstr "邮件列表数量" |
||||
|
||||
#: admin/workgroup.py:26 |
||||
msgid "Newsletter length" |
||||
msgstr "读物数量" |
||||
|
||||
#: cmsplugin_newsletter/cms_plugins.py:15 |
||||
msgid "Subscription Form" |
||||
msgstr "取消订阅" |
||||
|
||||
#: cmsplugin_newsletter/models.py:13 |
||||
msgid "show description" |
||||
msgstr "介绍" |
||||
|
||||
#: cmsplugin_newsletter/models.py:14 |
||||
msgid "Show the mailing list's description." |
||||
msgstr "显示邮件列表的描述。" |
||||
|
||||
#: cmsplugin_newsletter/models.py:16 |
||||
msgid "Mailing List to subscribe to." |
||||
msgstr "邮件列表数量" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:36 |
||||
#, python-format |
||||
msgid "Add %(name)s" |
||||
msgstr "添加%(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:42 |
||||
msgid "Actions" |
||||
msgstr "行为" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:51 |
||||
#, python-format |
||||
msgid "Import %(name)ss" |
||||
msgstr "导入%(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:58 |
||||
msgid "Add to a mailing list" |
||||
msgstr "创建一个邮件列表" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:65 |
||||
#, python-format |
||||
msgid "Export %(name)s as VCard" |
||||
msgstr "以VCard导出联系人%(name)s" |
||||
|
||||
#: templates/admin/newsletter/contact/change_list.html:70 |
||||
#, python-format |
||||
msgid "Export %(name)s as Excel" |
||||
msgstr "导出%(name)s" |
||||
|
||||
#: templates/newsletter/contact_import.html:7 |
||||
msgid "Home" |
||||
msgstr "首页" |
||||
|
||||
#: templates/newsletter/contact_import.html:10 |
||||
msgid "Importation" |
||||
msgstr "导入" |
||||
|
||||
#: templates/newsletter/contact_import.html:24 |
||||
msgid "Excel" |
||||
msgstr "Excel" |
||||
|
||||
#: templates/newsletter/contact_import.html:27 |
||||
msgid "Excel file (.xls)" |
||||
msgstr "导出文件(.xls)" |
||||
|
||||
#: templates/newsletter/contact_import.html:31 |
||||
msgid "Import contacts from a Excel file." |
||||
msgstr "以VCard导出联系人" |
||||
|
||||
#: templates/newsletter/contact_import.html:32 |
||||
msgid "Columns are [email][last name][first name][tags]." |
||||
msgstr "列表含[电子邮件] [姓氏] [名字] [标签]。" |
||||
|
||||
#: templates/newsletter/contact_import.html:33 |
||||
#: templates/newsletter/contact_import.html:56 |
||||
#: templates/newsletter/contact_import.html:98 |
||||
msgid "All columns are optionnal excepting the email." |
||||
msgstr "除电子邮件外所有列皆为可选。" |
||||
|
||||
#: templates/newsletter/contact_import.html:38 |
||||
#: templates/newsletter/contact_import.html:61 |
||||
#: templates/newsletter/contact_import.html:81 |
||||
#: templates/newsletter/contact_import.html:103 |
||||
msgid "Import" |
||||
msgstr "导入" |
||||
|
||||
#: templates/newsletter/contact_import.html:47 |
||||
msgid "Text" |
||||
msgstr "文本" |
||||
|
||||
#: templates/newsletter/contact_import.html:50 |
||||
msgid "Text file (.txt, .csv)" |
||||
msgstr "文本文件(.txt,.csv格式)" |
||||
|
||||
#: templates/newsletter/contact_import.html:54 |
||||
msgid "Import contacts from a text file, or a CSV file." |
||||
msgstr "从文本文件或CSV文件导入联系人。" |
||||
|
||||
#: templates/newsletter/contact_import.html:55 |
||||
#: templates/newsletter/contact_import.html:97 |
||||
msgid "" |
||||
"Columns are [email][last name][first name][tags], splitted by a dot coma." |
||||
msgstr "列表含[电子邮件] [姓氏] [名字] [标签],由逗号分隔。" |
||||
|
||||
#: templates/newsletter/contact_import.html:70 |
||||
msgid "VCard" |
||||
msgstr "VCard" |
||||
|
||||
#: templates/newsletter/contact_import.html:73 |
||||
msgid "VCard file (.cvf)" |
||||
msgstr "VCard文件(.cvf)" |
||||
|
||||
#: templates/newsletter/contact_import.html:77 |
||||
msgid "" |
||||
"Import contacts from your favorite mail client, by providing a VCard file." |
||||
msgstr "用VCard文件导入您最喜欢的邮件客户端联系人。" |
||||
|
||||
#: templates/newsletter/contact_import.html:90 |
||||
#: templates/newsletter/contact_import.html:93 |
||||
msgid "Raw text" |
||||
msgstr "" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:4 |
||||
#: templates/newsletter/mailing_list_subscribe.html:7 |
||||
msgid "Subscription to mailing list" |
||||
msgstr "创建一个邮件列表" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:10 |
||||
msgid "Thanks for your subscription!" |
||||
msgstr "总订阅数" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:16 |
||||
msgid "Validate this form to subscribe to the mailing lists." |
||||
msgstr "验证此表以取消订阅本邮件列表。" |
||||
|
||||
#: templates/newsletter/mailing_list_subscribe.html:21 |
||||
#: templates/newsletter/cms/subscription_form.html:20 |
||||
msgid "Subscribe" |
||||
msgstr "订户" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:4 |
||||
#: templates/newsletter/mailing_list_unsubscribe.html:7 |
||||
msgid "Unsubscription" |
||||
msgstr "取消订阅" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:9 |
||||
msgid "You are unsubscribed for this mailing list." |
||||
msgstr "你已退订这个邮件列表。" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:11 |
||||
msgid "Validate this form to unsubscribe to this mailing list." |
||||
msgstr "验证此表以取消订阅本邮件列表。" |
||||
|
||||
#: templates/newsletter/mailing_list_unsubscribe.html:15 |
||||
msgid "Unsubscribe" |
||||
msgstr "取消订阅" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:9 |
||||
#: templates/newsletter/newsletter_statistics.html:68 |
||||
msgid "Admin." |
||||
msgstr "管理" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:23 |
||||
msgid "Date" |
||||
msgstr "日期" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:24 |
||||
msgid "Contact" |
||||
msgstr "联系" |
||||
|
||||
#: templates/newsletter/newsletter_historic.html:25 |
||||
msgid "Action" |
||||
msgstr "行为" |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:5 |
||||
msgid "If you cannot see this email," |
||||
msgstr "如果你不能看到这封电子邮件," |
||||
|
||||
#: templates/newsletter/newsletter_link_site.html:6 |
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:6 |
||||
msgid "click here" |
||||
msgstr "点击这里" |
||||
|
||||
#: templates/newsletter/newsletter_link_unsubscribe.html:5 |
||||
msgid "For unsubscribing to this mailing list," |
||||
msgstr "你已退订这个邮件列表。" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:86 views/statistics.py:147 |
||||
msgid "Consultation histogram" |
||||
msgstr "参考直方图" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:89 |
||||
msgid "Period" |
||||
msgstr "周期" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:112 |
||||
#: templates/newsletter/newsletter_statistics.html:113 |
||||
msgid "Broadcasting statistics" |
||||
msgstr "查看统计" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:115 views/statistics.py:139 |
||||
msgid "Total openings" |
||||
msgstr "总订阅数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:120 |
||||
msgid "Openings on site" |
||||
msgstr "访问于" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:125 |
||||
msgid "Total openings unique" |
||||
msgstr "总访问数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:130 |
||||
msgid "Unknow delivery" |
||||
msgstr "未知邮件" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:135 |
||||
msgid "Unsubscriptions" |
||||
msgstr "取消订阅" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:140 |
||||
msgid "Openings average" |
||||
msgstr "总订阅数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:148 |
||||
#: templates/newsletter/newsletter_statistics.html:149 |
||||
msgid "Links statistics" |
||||
msgstr "查看统计" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:151 views/statistics.py:143 |
||||
msgid "Total clicked links" |
||||
msgstr "总订阅数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:156 |
||||
msgid "Total clicked links unique" |
||||
msgstr "总点击次数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:161 |
||||
msgid "Clicked links by openings" |
||||
msgstr "每次访问的点击数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:166 |
||||
msgid "Clicked links average" |
||||
msgstr "总订阅数" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:178 |
||||
msgid "Report" |
||||
msgstr "导出报告" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:180 |
||||
msgid "Download CSV report" |
||||
msgstr "下载CSV报告" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:185 |
||||
msgid "Informations" |
||||
msgstr "导入" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:186 |
||||
msgid "Recipients" |
||||
msgstr "接收人" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:187 |
||||
msgid "View" |
||||
msgstr "查看" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:190 |
||||
msgid "Sending date" |
||||
msgstr "发送日期" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:193 |
||||
msgid "Tests sent" |
||||
msgstr "发送测试" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:198 |
||||
msgid "Top Links" |
||||
msgstr "受欢迎的链接" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:199 |
||||
msgid "Density map" |
||||
msgstr "密度图" |
||||
|
||||
#: templates/newsletter/newsletter_statistics.html:208 |
||||
msgid "No Top Links yet." |
||||
msgstr "目前尚未有任何的受欢迎链接" |
||||
|
||||
#: templates/newsletter/cms/subscription_form.html:8 |
||||
msgid "You have successfully subscribed to the mailing list!" |
||||
msgstr "你已退订这个邮件列表。" |
||||
|
||||
#: utils/importation.py:52 |
||||
#, python-format |
||||
msgid "Mailing list created by importation at %s" |
||||
msgstr "于%s合并创建的邮件列表" |
||||
|
||||
#: utils/importation.py:53 |
||||
#, python-format |
||||
msgid "Contacts imported by %s." |
||||
msgstr "联系人由%s导入。" |
||||
|
||||
#: views/statistics.py:54 |
||||
#, python-format |
||||
msgid "Statistics of %s" |
||||
msgstr "%s统计" |
||||
|
||||
#: views/statistics.py:76 |
||||
msgid "openings" |
||||
msgstr "总订阅数" |
||||
|
||||
#: views/statistics.py:139 |
||||
msgid "#val# openings" |
||||
msgstr "总订阅数" |
||||
|
||||
#: views/statistics.py:143 |
||||
msgid "#val# clicks" |
||||
msgstr "点击数" |
||||
|
||||
#: views/tracking.py:67 |
||||
#, python-format |
||||
msgid "Historic of %s" |
||||
msgstr "%s的历史" |
||||
|
||||
#~ msgid "key1: value1 key2: value2, splitted by return line." |
||||
#~ msgstr "key1: value1 key2: value2, splitted by return line." |
||||
|
||||
#~ msgid "Can change status" |
||||
#~ msgstr "Can change status" |
||||
|
||||
#~ msgid "VCard import" |
||||
#~ msgstr "VCard import" |
||||
|
||||
#~ msgid "Contacts" |
||||
#~ msgstr "Contacts" |
||||
|
||||
#~ msgid "Mailing List" |
||||
#~ msgstr "Mailing List" |
||||
|
||||
#~ msgid "Mailing Lists" |
||||
#~ msgstr "Mailing Lists" |
||||
|
||||
#~ msgid "Newsletter" |
||||
#~ msgstr "Newsletter" |
||||
|
||||
#~ msgid "Newsletters" |
||||
#~ msgstr "Newsletters" |
||||
|
||||
#~ msgid "Link" |
||||
#~ msgstr "Link" |
||||
|
||||
#~ msgid "Links" |
||||
#~ msgstr "Links" |
||||
|
||||
#~ msgid "group" |
||||
#~ msgstr "group" |
||||
|
||||
#~ msgid "Connection valid" |
||||
#~ msgstr "Connection valid" |
||||
|
||||
#~ msgid "Double openings" |
||||
#~ msgstr "Total Subscriptions" |
||||
|
||||
|
||||
@ -0,0 +1,494 @@ |
||||
"""Mailer for emencia.django.newsletter""" |
||||
import re |
||||
import sys |
||||
import time |
||||
import threading |
||||
import mimetypes |
||||
import base64 |
||||
import quopri |
||||
from random import sample |
||||
from StringIO import StringIO |
||||
from datetime import datetime |
||||
from datetime import timedelta |
||||
from smtplib import SMTPRecipientsRefused |
||||
|
||||
try: |
||||
from email.mime.multipart import MIMEMultipart |
||||
from email.mime.text import MIMEText |
||||
from email.mime.Encoders import encode_base64 |
||||
from email.mime.MIMEAudio import MIMEAudio |
||||
from email.mime.MIMEBase import MIMEBase |
||||
from email.mime.MIMEImage import MIMEImage |
||||
except ImportError: # Python 2.4 compatibility |
||||
from email.MIMEMultipart import MIMEMultipart |
||||
from email.MIMEText import MIMEText |
||||
from email.Encoders import encode_base64 |
||||
from email.MIMEAudio import MIMEAudio |
||||
from email.MIMEBase import MIMEBase |
||||
from email.MIMEImage import MIMEImage |
||||
from email import message_from_file |
||||
from html2text import html2text as html2text_orig |
||||
from django.contrib.sites.models import Site |
||||
from django.template import Context, Template |
||||
from django.template.loader import render_to_string |
||||
from django.utils.encoding import smart_str |
||||
from django.utils.encoding import smart_unicode |
||||
from django.core.urlresolvers import reverse |
||||
|
||||
from emencia.django.newsletter.models import Newsletter |
||||
from emencia.django.newsletter.models import ContactMailingStatus |
||||
from emencia.django.newsletter.utils.tokens import tokenize |
||||
from emencia.django.newsletter.utils.newsletter import track_links |
||||
from emencia.django.newsletter.utils.newsletter import body_insertion |
||||
from emencia.django.newsletter.settings import TRACKING_LINKS |
||||
from emencia.django.newsletter.settings import TRACKING_IMAGE |
||||
from emencia.django.newsletter.settings import TRACKING_IMAGE_FORMAT |
||||
from emencia.django.newsletter.settings import UNIQUE_KEY_LENGTH |
||||
from emencia.django.newsletter.settings import UNIQUE_KEY_CHAR_SET |
||||
from emencia.django.newsletter.settings import INCLUDE_UNSUBSCRIPTION |
||||
from emencia.django.newsletter.settings import SLEEP_BETWEEN_SENDING |
||||
from emencia.django.newsletter.settings import \ |
||||
RESTART_CONNECTION_BETWEEN_SENDING |
||||
|
||||
import HTMLParser |
||||
import chardet |
||||
|
||||
if not hasattr(timedelta, 'total_seconds'): |
||||
def total_seconds(td): |
||||
return ((td.microseconds + |
||||
(td.seconds + td.days * 24 * 3600) * 1000000) / |
||||
1000000.0) |
||||
else: |
||||
total_seconds = lambda td: td.total_seconds() |
||||
|
||||
|
||||
LINK_RE = re.compile(r"https?://([^ \n]+\n)+[^ \n]+", re.MULTILINE) |
||||
|
||||
|
||||
def html2text(html): |
||||
"""Use html2text but repair newlines cutting urls. |
||||
Need to use this hack until |
||||
https://github.com/aaronsw/html2text/issues/#issue/7 is not fixed""" |
||||
txt = html2text_orig(html) |
||||
return txt |
||||
""" |
||||
links = list(LINK_RE.finditer(txt)) |
||||
out = StringIO() |
||||
pos = 0 |
||||
for l in links: |
||||
out.write(txt[pos:l.start()]) |
||||
out.write(l.group().replace('\n', '')) |
||||
pos = l.end() |
||||
out.write(txt[pos:]) |
||||
return out.getvalue() |
||||
""" |
||||
|
||||
def encodestring(instring, tabs=0): |
||||
outfile = StringIO() |
||||
quopri.encode(StringIO(instring), outfile, tabs) |
||||
return outfile.getvalue() |
||||
|
||||
def decodestring(instring): |
||||
outfile = StringIO() |
||||
quopri.decode(StringIO(instring), outfile) |
||||
return outfile.getvalue() |
||||
|
||||
class NewsLetterSender(object): |
||||
|
||||
def __init__(self, newsletter, test=False, verbose=0): |
||||
self.test = test |
||||
self.verbose = verbose |
||||
self.newsletter = newsletter |
||||
self.newsletter_template = Template(self.newsletter.content) |
||||
self.title_template = Template(self.newsletter.title) |
||||
|
||||
def build_message(self, contact): |
||||
""" |
||||
Build the email as a multipart message containing |
||||
a multipart alternative for text (plain, HTML) plus |
||||
all the attached files. |
||||
""" |
||||
content_html = self.build_email_content(contact) |
||||
h = HTMLParser.HTMLParser() |
||||
content_html = h.unescape(content_html) |
||||
content_text = html2text(content_html) |
||||
|
||||
content_html = encodestring(smart_str(content_html)) |
||||
content_text = encodestring(smart_str(content_text)) |
||||
|
||||
|
||||
message = MIMEMultipart() |
||||
|
||||
message['Subject'] = smart_str(self.build_title_content(contact)) |
||||
message['From'] = smart_str(self.newsletter.header_sender) |
||||
message['Reply-to'] = smart_str(self.newsletter.header_reply) |
||||
message['To'] = smart_str(contact.mail_format()) |
||||
|
||||
message_alt = MIMEMultipart('alternative') |
||||
text = MIMEText(content_text, 'plain', 'UTF-8') |
||||
text.replace_header('Content-Transfer-Encoding', 'quoted-printable') |
||||
|
||||
message_alt.attach(text) |
||||
html = MIMEText(content_html, 'html', 'UTF-8') |
||||
html.replace_header('Content-Transfer-Encoding', 'quoted-printable') |
||||
#encode_base64(text) |
||||
message_alt.attach(html) |
||||
message.attach(message_alt) |
||||
|
||||
|
||||
for attachment in self.attachments: |
||||
message.attach(attachment) |
||||
|
||||
for header, value in self.newsletter.server.custom_headers.items(): |
||||
message[header] = value |
||||
|
||||
uidb36, token = tokenize(contact) |
||||
unsubscribe_link = 'http://' + Site.objects.get_current().domain + reverse('newsletter_mailinglist_unsubscribe', args=[self.newsletter.slug, uidb36, token]) |
||||
|
||||
message['List-Unsubscribe'] = '<' + unsubscribe_link + '>' |
||||
message['List-Id'] = str(self.newsletter.id) |
||||
|
||||
|
||||
return message |
||||
|
||||
def build_attachments(self): |
||||
"""Build email's attachment messages""" |
||||
attachments = [] |
||||
|
||||
for attachment in self.newsletter.attachment_set.all(): |
||||
ctype, encoding = mimetypes.guess_type(attachment.file_attachment.path) |
||||
|
||||
if ctype is None or encoding is not None: |
||||
ctype = 'application/octet-stream' |
||||
|
||||
maintype, subtype = ctype.split('/', 1) |
||||
|
||||
fd = open(attachment.file_attachment.path, 'rb') |
||||
if maintype == 'text': |
||||
message_attachment = MIMEText(fd.read(), _subtype=subtype) |
||||
|
||||
elif maintype == 'message': |
||||
message_attachment = message_from_file(fd) |
||||
elif maintype == 'image': |
||||
message_attachment = MIMEImage(fd.read(), _subtype=subtype) |
||||
elif maintype == 'audio': |
||||
message_attachment = MIMEAudio(fd.read(), _subtype=subtype) |
||||
else: |
||||
message_attachment = MIMEBase(maintype, subtype) |
||||
message_attachment.set_payload(fd.read()) |
||||
encode_base64(message_attachment) |
||||
fd.close() |
||||
message_attachment.add_header('Content-ID', '<'+attachment.title+'>') |
||||
#message_attachment.add_header('Content-Disposition', 'attachment', |
||||
# filename=attachment.title) |
||||
attachments.append(message_attachment) |
||||
|
||||
return attachments |
||||
|
||||
def build_title_content(self, contact): |
||||
"""Generate the email title for a contact""" |
||||
context = Context({'contact': contact, |
||||
'UNIQUE_KEY': ''.join(sample(UNIQUE_KEY_CHAR_SET, |
||||
UNIQUE_KEY_LENGTH))}) |
||||
title = self.title_template.render(context) |
||||
return title |
||||
|
||||
def build_email_content(self, contact): |
||||
"""Generate the mail for a contact""" |
||||
uidb36, token = tokenize(contact) |
||||
context = Context({'contact': contact, |
||||
'domain': Site.objects.get_current().domain, |
||||
'newsletter': self.newsletter, |
||||
'tracking_image_format': TRACKING_IMAGE_FORMAT, |
||||
'uidb36': uidb36, 'token': token}) |
||||
|
||||
content = self.newsletter_template.render(context) |
||||
|
||||
if TRACKING_LINKS: |
||||
content = track_links(content, context) |
||||
link_site = render_to_string('newsletter/newsletter_link_site.html', context) |
||||
content = body_insertion(content, link_site) |
||||
|
||||
|
||||
if INCLUDE_UNSUBSCRIPTION: |
||||
unsubscription = render_to_string('newsletter/newsletter_link_unsubscribe.html', context) |
||||
content = body_insertion(content, unsubscription, end=True) |
||||
|
||||
if TRACKING_IMAGE: |
||||
image_tracking = render_to_string('newsletter/newsletter_image_tracking.html', context) |
||||
content = body_insertion(content, image_tracking, end=True) |
||||
#return content |
||||
|
||||
#return encodestring(content) |
||||
return smart_unicode(content) |
||||
|
||||
def update_newsletter_status(self): |
||||
"""Update the status of the newsletter""" |
||||
if self.test: |
||||
return |
||||
|
||||
if self.newsletter.status == Newsletter.WAITING: |
||||
self.newsletter.status = Newsletter.SENDING |
||||
if self.newsletter.status == Newsletter.SENDING and \ |
||||
self.newsletter.mails_sent() >= \ |
||||
self.newsletter.mailing_list.expedition_set().count(): |
||||
self.newsletter.status = Newsletter.SENT |
||||
self.newsletter.save() |
||||
|
||||
@property |
||||
def can_send(self): |
||||
"""Check if the newsletter can be sent""" |
||||
if self.test: |
||||
return True |
||||
if self.newsletter.sending_date <= datetime.now() and \ |
||||
(self.newsletter.status == Newsletter.WAITING or \ |
||||
self.newsletter.status == Newsletter.SENDING): |
||||
return True |
||||
|
||||
return False |
||||
|
||||
@property |
||||
def expedition_list(self): |
||||
"""Build the expedition list""" |
||||
if self.test: |
||||
return self.newsletter.test_contacts.all() |
||||
|
||||
already_sent = ContactMailingStatus.objects.filter(status=ContactMailingStatus.SENT, |
||||
newsletter=self.newsletter).values_list('contact__id', flat=True) |
||||
expedition_list = self.newsletter.mailing_list.expedition_set().exclude(id__in=already_sent) |
||||
return expedition_list |
||||
|
||||
def update_contact_status(self, contact, exception): |
||||
if exception is None: |
||||
status = (self.test |
||||
and ContactMailingStatus.SENT_TEST |
||||
or ContactMailingStatus.SENT) |
||||
elif isinstance(exception, (UnicodeError, SMTPRecipientsRefused)): |
||||
status = ContactMailingStatus.INVALID |
||||
contact.valid = False |
||||
contact.save() |
||||
else: |
||||
# signal error |
||||
print >>sys.stderr, 'smtp connection raises %s' % exception |
||||
status = ContactMailingStatus.ERROR |
||||
|
||||
ContactMailingStatus.objects.create( |
||||
newsletter=self.newsletter, contact=contact, status=status) |
||||
|
||||
|
||||
class Mailer(NewsLetterSender): |
||||
"""Mailer for generating and sending newsletters |
||||
In test mode the mailer always send mails but do not log it""" |
||||
smtp = None |
||||
|
||||
def run(self): |
||||
"""Send the mails""" |
||||
if not self.can_send: |
||||
return |
||||
|
||||
if not self.smtp: |
||||
self.smtp_connect() |
||||
|
||||
self.attachments = self.build_attachments() |
||||
|
||||
expedition_list = self.expedition_list |
||||
|
||||
number_of_recipients = len(expedition_list) |
||||
if self.verbose: |
||||
print '%i emails will be sent' % number_of_recipients |
||||
|
||||
i = 1 |
||||
for contact in expedition_list: |
||||
if self.verbose: |
||||
print '- Processing %s/%s (%s)' % ( |
||||
i, number_of_recipients, contact.pk) |
||||
message = self.build_message(contact) |
||||
self.smtp.sendmail(self.newsletter.header_sender, |
||||
contact.email, |
||||
message.as_string()) |
||||
try: |
||||
pass |
||||
|
||||
except Exception, e: |
||||
exception = e |
||||
else: |
||||
exception = None |
||||
self.update_contact_status(contact, exception) |
||||
|
||||
if SLEEP_BETWEEN_SENDING: |
||||
time.sleep(SLEEP_BETWEEN_SENDING) |
||||
if RESTART_CONNECTION_BETWEEN_SENDING: |
||||
self.smtp.quit() |
||||
self.smtp_connect() |
||||
|
||||
i += 1 |
||||
|
||||
self.smtp.quit() |
||||
self.update_newsletter_status() |
||||
|
||||
def smtp_connect(self): |
||||
"""Make a connection to the SMTP""" |
||||
self.smtp = self.newsletter.server.connect() |
||||
|
||||
@property |
||||
def expedition_list(self): |
||||
"""Build the expedition list""" |
||||
credits = self.newsletter.server.credits() |
||||
if credits <= 0: |
||||
return [] |
||||
return super(Mailer, self).expedition_list[:credits] |
||||
|
||||
@property |
||||
def can_send(self): |
||||
"""Check if the newsletter can be sent""" |
||||
if self.newsletter.server.credits() <= 0: |
||||
return False |
||||
return super(Mailer, self).can_send |
||||
|
||||
|
||||
class SMTPMailer(object): |
||||
"""for generating and sending newsletters |
||||
|
||||
SMTPMailer takes the problem on a different basis than Mailer, it use |
||||
a SMTP server and make a roundrobin over all newsletters to be sent |
||||
dispatching it's send command to smtp server regularly over time to |
||||
reach the limit. |
||||
|
||||
It is more robust in term of predictability. |
||||
|
||||
In test mode the mailer always send mails but do not log it""" |
||||
|
||||
smtp = None |
||||
|
||||
def __init__(self, server, test=False, verbose=0): |
||||
self.start = datetime.now() |
||||
self.server = server |
||||
self.test = test |
||||
self.verbose = verbose |
||||
self.stop_event = threading.Event() |
||||
|
||||
def run(self): |
||||
"""send mails |
||||
""" |
||||
sending = dict() |
||||
candidates = self.get_candidates() |
||||
roundrobin = [] |
||||
|
||||
if not self.smtp: |
||||
self.smtp_connect() |
||||
|
||||
delay = self.server.delay() |
||||
|
||||
i = 1 |
||||
sleep_time = 0 |
||||
while (not self.stop_event.wait(sleep_time) and |
||||
not self.stop_event.is_set()): |
||||
if not roundrobin: |
||||
# refresh the list |
||||
for expedition in candidates: |
||||
if expedition.id not in sending and expedition.can_send: |
||||
sending[expedition.id] = expedition() |
||||
|
||||
roundrobin = list(sending.keys()) |
||||
|
||||
if roundrobin: |
||||
nl_id = roundrobin.pop() |
||||
nl = sending[nl_id] |
||||
|
||||
try: |
||||
self.smtp.sendmail(*nl.next()) |
||||
except StopIteration: |
||||
del sending[nl_id] |
||||
except Exception, e: |
||||
nl.throw(e) |
||||
else: |
||||
nl.next() |
||||
|
||||
sleep_time = (delay * i - |
||||
total_seconds(datetime.now() - self.start)) |
||||
if SLEEP_BETWEEN_SENDING: |
||||
sleep_time = max(time.sleep(SLEEP_BETWEEN_SENDING), sleep_time) |
||||
if RESTART_CONNECTION_BETWEEN_SENDING: |
||||
self.smtp.quit() |
||||
self.smtp_connect() |
||||
i += 1 |
||||
else: |
||||
# no work, sleep a bit and some reset |
||||
sleep_time = 600 |
||||
i = 1 |
||||
self.start = datetime.now() |
||||
|
||||
if sleep_time < 0: |
||||
sleep_time = 0 |
||||
|
||||
self.smtp.quit() |
||||
|
||||
def get_candidates(self): |
||||
"""get candidates NL""" |
||||
return [NewsLetterExpedition(nl, self) |
||||
for nl in Newsletter.objects.filter(server=self.server)] |
||||
|
||||
def smtp_connect(self): |
||||
"""Make a connection to the SMTP""" |
||||
self.smtp = self.server.connect() |
||||
|
||||
|
||||
class NewsLetterExpedition(NewsLetterSender): |
||||
"""coroutine that will give messages to be sent with mailer |
||||
|
||||
between to message it alternate with None so that |
||||
the mailer give it a chance to save status to db |
||||
""" |
||||
|
||||
def __init__(self, newsletter, mailer): |
||||
super(NewsLetterExpedition, self).__init__( |
||||
newsletter, test=mailer.test, verbose=mailer.verbose) |
||||
self.mailer = mailer |
||||
self.id = newsletter.id |
||||
|
||||
def __call__(self): |
||||
"""iterator on messages to be sent |
||||
""" |
||||
newsletter = self.newsletter |
||||
|
||||
title = 'smtp-%s (%s), nl-%s (%s)' % ( |
||||
self.mailer.server.id, self.mailer.server.name[:10], |
||||
newsletter.id, newsletter.title[:10]) |
||||
# ajust len |
||||
title = '%-30s' % title |
||||
|
||||
self.attachments = self.build_attachments() |
||||
|
||||
expedition_list = self.expedition_list |
||||
|
||||
number_of_recipients = len(expedition_list) |
||||
if self.verbose: |
||||
print '%s %s: %i emails will be sent' % ( |
||||
datetime.now().strftime('%Y-%m-%d'), |
||||
title, number_of_recipients) |
||||
|
||||
try: |
||||
i = 1 |
||||
for contact in expedition_list: |
||||
if self.verbose: |
||||
print '%s %s: processing %s/%s (%s)' % ( |
||||
datetime.now().strftime('%H:%M:%S'), |
||||
title, i, number_of_recipients, contact.pk) |
||||
|
||||
try: |
||||
message = self.build_message(contact) |
||||
yield (smart_str(self.newsletter.header_sender), |
||||
contact.email, |
||||
message.as_string()) |
||||
except Exception, e: |
||||
exception = e |
||||
else: |
||||
exception = None |
||||
|
||||
self.update_contact_status(contact, exception) |
||||
i += 1 |
||||
# this one permits us to save to database imediately |
||||
# and acknoledge eventual exceptions |
||||
yield None |
||||
finally: |
||||
self.update_newsletter_status() |
||||
@ -0,0 +1,31 @@ |
||||
"""Command for sending the newsletter""" |
||||
from django.conf import settings |
||||
from django.utils.translation import activate |
||||
from django.core.management.base import NoArgsCommand |
||||
|
||||
from emencia.django.newsletter.mailer import Mailer |
||||
from emencia.django.newsletter.models import Newsletter |
||||
|
||||
|
||||
class Command(NoArgsCommand): |
||||
"""Send the newsletter in queue""" |
||||
help = 'Send the newsletter in queue' |
||||
|
||||
def handle_noargs(self, **options): |
||||
verbose = int(options['verbosity']) |
||||
|
||||
if verbose: |
||||
print 'Starting sending newsletters...' |
||||
|
||||
activate(settings.LANGUAGE_CODE) |
||||
|
||||
for newsletter in Newsletter.objects.exclude( |
||||
status=Newsletter.DRAFT).exclude(status=Newsletter.SENT): |
||||
mailer = Mailer(newsletter, verbose=verbose) |
||||
if mailer.can_send: |
||||
if verbose: |
||||
print 'Start emailing %s' % newsletter.title |
||||
mailer.run() |
||||
|
||||
if verbose: |
||||
print 'End session sending' |
||||
@ -0,0 +1,60 @@ |
||||
"""Command for sending the newsletter""" |
||||
from threading import Thread |
||||
import signal |
||||
import sys |
||||
|
||||
from django.conf import settings |
||||
from django.utils.translation import activate |
||||
from django.core import signals |
||||
from django.core.management.base import NoArgsCommand |
||||
|
||||
from emencia.django.newsletter.mailer import SMTPMailer |
||||
from emencia.django.newsletter.models import SMTPServer |
||||
|
||||
|
||||
class Command(NoArgsCommand): |
||||
"""Send the newsletter in queue""" |
||||
help = 'Send the newsletter in queue' |
||||
|
||||
def handle_noargs(self, **options): |
||||
verbose = int(options['verbosity']) |
||||
|
||||
if verbose: |
||||
print 'Starting sending newsletters...' |
||||
|
||||
activate(settings.LANGUAGE_CODE) |
||||
|
||||
senders = SMTPServer.objects.all() |
||||
workers = [] |
||||
|
||||
for sender in senders: |
||||
worker = SMTPMailer(sender, verbose=verbose) |
||||
thread = Thread(target=worker.run, name=sender.name) |
||||
workers.append((worker, thread)) |
||||
|
||||
handler = term_handler(workers) |
||||
for s in [signal.SIGTERM, signal.SIGINT]: |
||||
signal.signal(s, handler) |
||||
|
||||
# first close current connection |
||||
signals.request_finished.send(sender=self.__class__) |
||||
|
||||
for worker, thread in workers: |
||||
thread.start() |
||||
|
||||
signal.pause() # wait for sigterm |
||||
|
||||
for worker, thread in workers: |
||||
if thread.is_alive(): |
||||
thread.join() |
||||
|
||||
sys.exit(0) |
||||
|
||||
|
||||
def term_handler(workers): |
||||
|
||||
def handler(signum, frame): |
||||
for worker, thread in workers: |
||||
worker.stop_event.set() |
||||
|
||||
return handler |
||||
@ -0,0 +1,40 @@ |
||||
"""Managers for emencia.django.newsletter""" |
||||
from django.db import models |
||||
from accounts.models import User |
||||
|
||||
|
||||
class ContactManager(models.Manager): |
||||
"""Manager for the contacts""" |
||||
|
||||
def subscribers(self): |
||||
"""Return all subscribers""" |
||||
return self.get_query_set().filter(subscriber=True) |
||||
|
||||
def unsubscribers(self): |
||||
"""Return all unsubscribers""" |
||||
return self.get_query_set().filter(subscriber=False) |
||||
|
||||
def valids(self): |
||||
"""Return only valid contacts""" |
||||
return self.get_query_set().filter(valid=True) |
||||
|
||||
def valid_subscribers(self): |
||||
"""Return only valid subscribers""" |
||||
return self.subscribers().filter(valid=True) |
||||
|
||||
def activate(self, activation_key): |
||||
try: |
||||
contact = self.get(activation_code=activation_key) |
||||
except self.model.DoesNotExist: |
||||
return None |
||||
|
||||
contact.activated = True |
||||
try: |
||||
user = User.objects.get(username=contact.email) |
||||
except User.DoesNotExist: |
||||
user = None |
||||
|
||||
contact.user = user |
||||
|
||||
contact.save() |
||||
return contact |
||||
@ -0,0 +1,272 @@ |
||||
from south.db import db |
||||
from django.db import models |
||||
from emencia.django.newsletter.models import * |
||||
|
||||
|
||||
class Migration: |
||||
|
||||
def forwards(self, orm): |
||||
|
||||
# Adding model 'MailingList' |
||||
db.create_table('newsletter_mailinglist', ( |
||||
('id', orm['newsletter.MailingList:id']), |
||||
('name', orm['newsletter.MailingList:name']), |
||||
('description', orm['newsletter.MailingList:description']), |
||||
('creation_date', orm['newsletter.MailingList:creation_date']), |
||||
('modification_date', orm['newsletter.MailingList:modification_date']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['MailingList']) |
||||
|
||||
# Adding model 'ContactMailingStatus' |
||||
db.create_table('newsletter_contactmailingstatus', ( |
||||
('id', orm['newsletter.ContactMailingStatus:id']), |
||||
('newsletter', orm['newsletter.ContactMailingStatus:newsletter']), |
||||
('contact', orm['newsletter.ContactMailingStatus:contact']), |
||||
('status', orm['newsletter.ContactMailingStatus:status']), |
||||
('link', orm['newsletter.ContactMailingStatus:link']), |
||||
('creation_date', orm['newsletter.ContactMailingStatus:creation_date']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['ContactMailingStatus']) |
||||
|
||||
# Adding model 'WorkGroup' |
||||
db.create_table('newsletter_workgroup', ( |
||||
('id', orm['newsletter.WorkGroup:id']), |
||||
('name', orm['newsletter.WorkGroup:name']), |
||||
('group', orm['newsletter.WorkGroup:group']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['WorkGroup']) |
||||
|
||||
# Adding model 'Link' |
||||
db.create_table('newsletter_link', ( |
||||
('id', orm['newsletter.Link:id']), |
||||
('title', orm['newsletter.Link:title']), |
||||
('url', orm['newsletter.Link:url']), |
||||
('creation_date', orm['newsletter.Link:creation_date']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['Link']) |
||||
|
||||
# Adding model 'Newsletter' |
||||
db.create_table('newsletter_newsletter', ( |
||||
('id', orm['newsletter.Newsletter:id']), |
||||
('title', orm['newsletter.Newsletter:title']), |
||||
('content', orm['newsletter.Newsletter:content']), |
||||
('mailing_list', orm['newsletter.Newsletter:mailing_list']), |
||||
('server', orm['newsletter.Newsletter:server']), |
||||
('header_sender', orm['newsletter.Newsletter:header_sender']), |
||||
('header_reply', orm['newsletter.Newsletter:header_reply']), |
||||
('status', orm['newsletter.Newsletter:status']), |
||||
('sending_date', orm['newsletter.Newsletter:sending_date']), |
||||
('slug', orm['newsletter.Newsletter:slug']), |
||||
('creation_date', orm['newsletter.Newsletter:creation_date']), |
||||
('modification_date', orm['newsletter.Newsletter:modification_date']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['Newsletter']) |
||||
|
||||
# Adding model 'SMTPServer' |
||||
db.create_table('newsletter_smtpserver', ( |
||||
('id', orm['newsletter.SMTPServer:id']), |
||||
('name', orm['newsletter.SMTPServer:name']), |
||||
('host', orm['newsletter.SMTPServer:host']), |
||||
('user', orm['newsletter.SMTPServer:user']), |
||||
('password', orm['newsletter.SMTPServer:password']), |
||||
('port', orm['newsletter.SMTPServer:port']), |
||||
('tls', orm['newsletter.SMTPServer:tls']), |
||||
('headers', orm['newsletter.SMTPServer:headers']), |
||||
('mails_hour', orm['newsletter.SMTPServer:mails_hour']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['SMTPServer']) |
||||
|
||||
# Adding model 'Contact' |
||||
db.create_table('newsletter_contact', ( |
||||
('id', orm['newsletter.Contact:id']), |
||||
('email', orm['newsletter.Contact:email']), |
||||
('first_name', orm['newsletter.Contact:first_name']), |
||||
('last_name', orm['newsletter.Contact:last_name']), |
||||
('subscriber', orm['newsletter.Contact:subscriber']), |
||||
('valid', orm['newsletter.Contact:valid']), |
||||
('tester', orm['newsletter.Contact:tester']), |
||||
('tags', orm['newsletter.Contact:tags']), |
||||
('content_type', orm['newsletter.Contact:content_type']), |
||||
('object_id', orm['newsletter.Contact:object_id']), |
||||
('creation_date', orm['newsletter.Contact:creation_date']), |
||||
('modification_date', orm['newsletter.Contact:modification_date']), |
||||
)) |
||||
db.send_create_signal('newsletter', ['Contact']) |
||||
|
||||
# Adding ManyToManyField 'WorkGroup.mailinglists' |
||||
db.create_table('newsletter_workgroup_mailinglists', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('workgroup', models.ForeignKey(orm.WorkGroup, null=False)), |
||||
('mailinglist', models.ForeignKey(orm.MailingList, null=False)) |
||||
)) |
||||
|
||||
# Adding ManyToManyField 'MailingList.subscribers' |
||||
db.create_table('newsletter_mailinglist_subscribers', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('mailinglist', models.ForeignKey(orm.MailingList, null=False)), |
||||
('contact', models.ForeignKey(orm.Contact, null=False)) |
||||
)) |
||||
|
||||
# Adding ManyToManyField 'WorkGroup.contacts' |
||||
db.create_table('newsletter_workgroup_contacts', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('workgroup', models.ForeignKey(orm.WorkGroup, null=False)), |
||||
('contact', models.ForeignKey(orm.Contact, null=False)) |
||||
)) |
||||
|
||||
# Adding ManyToManyField 'WorkGroup.newsletters' |
||||
db.create_table('newsletter_workgroup_newsletters', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('workgroup', models.ForeignKey(orm.WorkGroup, null=False)), |
||||
('newsletter', models.ForeignKey(orm.Newsletter, null=False)) |
||||
)) |
||||
|
||||
# Adding ManyToManyField 'MailingList.unsubscribers' |
||||
db.create_table('newsletter_mailinglist_unsubscribers', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('mailinglist', models.ForeignKey(orm.MailingList, null=False)), |
||||
('contact', models.ForeignKey(orm.Contact, null=False)) |
||||
)) |
||||
|
||||
# Adding ManyToManyField 'Newsletter.test_contacts' |
||||
db.create_table('newsletter_newsletter_test_contacts', ( |
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), |
||||
('newsletter', models.ForeignKey(orm.Newsletter, null=False)), |
||||
('contact', models.ForeignKey(orm.Contact, null=False)) |
||||
)) |
||||
|
||||
def backwards(self, orm): |
||||
|
||||
# Deleting model 'MailingList' |
||||
db.delete_table('newsletter_mailinglist') |
||||
|
||||
# Deleting model 'ContactMailingStatus' |
||||
db.delete_table('newsletter_contactmailingstatus') |
||||
|
||||
# Deleting model 'WorkGroup' |
||||
db.delete_table('newsletter_workgroup') |
||||
|
||||
# Deleting model 'Link' |
||||
db.delete_table('newsletter_link') |
||||
|
||||
# Deleting model 'Newsletter' |
||||
db.delete_table('newsletter_newsletter') |
||||
|
||||
# Deleting model 'SMTPServer' |
||||
db.delete_table('newsletter_smtpserver') |
||||
|
||||
# Deleting model 'Contact' |
||||
db.delete_table('newsletter_contact') |
||||
|
||||
# Dropping ManyToManyField 'WorkGroup.mailinglists' |
||||
db.delete_table('newsletter_workgroup_mailinglists') |
||||
|
||||
# Dropping ManyToManyField 'MailingList.subscribers' |
||||
db.delete_table('newsletter_mailinglist_subscribers') |
||||
|
||||
# Dropping ManyToManyField 'WorkGroup.contacts' |
||||
db.delete_table('newsletter_workgroup_contacts') |
||||
|
||||
# Dropping ManyToManyField 'WorkGroup.newsletters' |
||||
db.delete_table('newsletter_workgroup_newsletters') |
||||
|
||||
# Dropping ManyToManyField 'MailingList.unsubscribers' |
||||
db.delete_table('newsletter_mailinglist_unsubscribers') |
||||
|
||||
# Dropping ManyToManyField 'Newsletter.test_contacts' |
||||
db.delete_table('newsletter_newsletter_test_contacts') |
||||
|
||||
models = { |
||||
'auth.group': { |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) |
||||
}, |
||||
'auth.permission': { |
||||
'Meta': {'unique_together': "(('content_type', 'codename'),)"}, |
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
||||
}, |
||||
'contenttypes.contenttype': { |
||||
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"}, |
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
||||
}, |
||||
'newsletter.contact': { |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}), |
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||
'subscriber': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), |
||||
'tags': ('tagging.fields.TagField', [], {'default': "''"}), |
||||
'tester': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
||||
'valid': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.contactmailingstatus': { |
||||
'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Contact']"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Link']", 'null': 'True', 'blank': 'True'}), |
||||
'newsletter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Newsletter']"}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {}) |
||||
}, |
||||
'newsletter.link': { |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.mailinglist': { |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.Contact']"}), |
||||
'unsubscribers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.newsletter': { |
||||
'content': ('django.db.models.fields.TextField', [], {'default': "u'<body>\\n<!-- Edit your newsletter here -->\\n</body>'"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'header_reply': ('django.db.models.fields.CharField', [], {'default': "'Emencia Newsletter<noreply@emencia.com>'", 'max_length': '255'}), |
||||
'header_sender': ('django.db.models.fields.CharField', [], {'default': "'Emencia Newsletter<noreply@emencia.com>'", 'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailing_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.MailingList']"}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'sending_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||
'server': ('django.db.models.fields.related.ForeignKey', [], {'default': '1', 'to': "orm['newsletter.SMTPServer']"}), |
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'test_contacts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.smtpserver': { |
||||
'headers': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mails_hour': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), |
||||
'port': ('django.db.models.fields.IntegerField', [], {'default': '25'}), |
||||
'tls': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
||||
'user': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.workgroup': { |
||||
'contacts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailinglists': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.MailingList']", 'null': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'newsletters': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['newsletter.Newsletter']", 'null': 'True', 'blank': 'True'}) |
||||
} |
||||
} |
||||
|
||||
complete_apps = ['newsletter'] |
||||
@ -0,0 +1,130 @@ |
||||
from south.db import db |
||||
from south.v2 import SchemaMigration |
||||
|
||||
|
||||
class Migration(SchemaMigration): |
||||
|
||||
def forwards(self, orm): |
||||
|
||||
# Adding model 'Attachment' |
||||
db.create_table('newsletter_attachment', ( |
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), |
||||
('newsletter', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['newsletter.Newsletter'])), |
||||
('title', self.gf('django.db.models.fields.CharField')(max_length=255)), |
||||
('file_attachment', self.gf('django.db.models.fields.files.FileField')(max_length=100)), |
||||
)) |
||||
db.send_create_signal('newsletter', ['Attachment']) |
||||
|
||||
def backwards(self, orm): |
||||
# Deleting model 'Attachment' |
||||
db.delete_table('newsletter_attachment') |
||||
|
||||
models = { |
||||
'auth.group': { |
||||
'Meta': {'object_name': 'Group'}, |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) |
||||
}, |
||||
'auth.permission': { |
||||
'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, |
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
||||
}, |
||||
'contenttypes.contenttype': { |
||||
'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, |
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
||||
}, |
||||
'newsletter.attachment': { |
||||
'Meta': {'object_name': 'Attachment'}, |
||||
'file_attachment': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'newsletter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Newsletter']"}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.contact': { |
||||
'Meta': {'object_name': 'Contact'}, |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}), |
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||
'subscriber': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), |
||||
'tags': ('tagging.fields.TagField', [], {'default': "''"}), |
||||
'tester': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
||||
'valid': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.contactmailingstatus': { |
||||
'Meta': {'object_name': 'ContactMailingStatus'}, |
||||
'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Contact']"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Link']", 'null': 'True', 'blank': 'True'}), |
||||
'newsletter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Newsletter']"}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {}) |
||||
}, |
||||
'newsletter.link': { |
||||
'Meta': {'object_name': 'Link'}, |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.mailinglist': { |
||||
'Meta': {'object_name': 'MailingList'}, |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'mailinglist_subscriber'", 'symmetrical': 'False', 'to': "orm['newsletter.Contact']"}), |
||||
'unsubscribers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'mailinglist_unsubscriber'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['newsletter.Contact']"}) |
||||
}, |
||||
'newsletter.newsletter': { |
||||
'Meta': {'object_name': 'Newsletter'}, |
||||
'content': ('django.db.models.fields.TextField', [], {'default': "u'<body>\\n<!-- Edit your newsletter here -->\\n</body>'"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'header_reply': ('django.db.models.fields.CharField', [], {'default': "'Giorgio Barbarotta Newsletter<noreply@giorgiobarbarotta.it>'", 'max_length': '255'}), |
||||
'header_sender': ('django.db.models.fields.CharField', [], {'default': "'Giorgio Barbarotta Newsletter<noreply@giorgiobarbarotta.it>'", 'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailing_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.MailingList']"}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'sending_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||
'server': ('django.db.models.fields.related.ForeignKey', [], {'default': '1', 'to': "orm['newsletter.SMTPServer']"}), |
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'test_contacts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.smtpserver': { |
||||
'Meta': {'object_name': 'SMTPServer'}, |
||||
'headers': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mails_hour': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), |
||||
'port': ('django.db.models.fields.IntegerField', [], {'default': '25'}), |
||||
'tls': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), |
||||
'user': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.workgroup': { |
||||
'Meta': {'object_name': 'WorkGroup'}, |
||||
'contacts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailinglists': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.MailingList']", 'null': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'newsletters': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Newsletter']", 'null': 'True', 'blank': 'True'}) |
||||
} |
||||
} |
||||
|
||||
complete_apps = ['newsletter'] |
||||
@ -0,0 +1,123 @@ |
||||
from south.db import db |
||||
from south.v2 import SchemaMigration |
||||
|
||||
|
||||
class Migration(SchemaMigration): |
||||
|
||||
def forwards(self, orm): |
||||
# Adding unique constraint on 'Newsletter', fields ['slug'] |
||||
db.create_unique('newsletter_newsletter', ['slug']) |
||||
|
||||
def backwards(self, orm): |
||||
# Removing unique constraint on 'Newsletter', fields ['slug'] |
||||
db.delete_unique('newsletter_newsletter', ['slug']) |
||||
|
||||
models = { |
||||
'auth.group': { |
||||
'Meta': {'object_name': 'Group'}, |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) |
||||
}, |
||||
'auth.permission': { |
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, |
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
||||
}, |
||||
'contenttypes.contenttype': { |
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, |
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
||||
}, |
||||
'newsletter.attachment': { |
||||
'Meta': {'object_name': 'Attachment'}, |
||||
'file_attachment': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'newsletter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Newsletter']"}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.contact': { |
||||
'Meta': {'ordering': "('creation_date',)", 'object_name': 'Contact'}, |
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}), |
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||
'subscriber': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||
'tags': ('tagging.fields.TagField', [], {'default': "''"}), |
||||
'tester': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||
'valid': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) |
||||
}, |
||||
'newsletter.contactmailingstatus': { |
||||
'Meta': {'ordering': "('creation_date',)", 'object_name': 'ContactMailingStatus'}, |
||||
'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Contact']"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Link']", 'null': 'True', 'blank': 'True'}), |
||||
'newsletter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.Newsletter']"}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {}) |
||||
}, |
||||
'newsletter.link': { |
||||
'Meta': {'ordering': "('creation_date',)", 'object_name': 'Link'}, |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.mailinglist': { |
||||
'Meta': {'ordering': "('creation_date',)", 'object_name': 'MailingList'}, |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'mailinglist_subscriber'", 'symmetrical': 'False', 'to': "orm['newsletter.Contact']"}), |
||||
'unsubscribers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'mailinglist_unsubscriber'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['newsletter.Contact']"}) |
||||
}, |
||||
'newsletter.newsletter': { |
||||
'Meta': {'ordering': "('creation_date',)", 'object_name': 'Newsletter'}, |
||||
'content': ('django.db.models.fields.TextField', [], {'default': "u'<body>\\n<!-- Edit your newsletter here -->\\n</body>'"}), |
||||
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||
'header_reply': ('django.db.models.fields.CharField', [], {'default': "'Emencia Newsletter<noreply@emencia.com>'", 'max_length': '255'}), |
||||
'header_sender': ('django.db.models.fields.CharField', [], {'default': "'Emencia Newsletter<noreply@emencia.com>'", 'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailing_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['newsletter.MailingList']"}), |
||||
'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||
'sending_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||
'server': ('django.db.models.fields.related.ForeignKey', [], {'default': '1', 'to': "orm['newsletter.SMTPServer']"}), |
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}), |
||||
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'test_contacts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||
}, |
||||
'newsletter.smtpserver': { |
||||
'Meta': {'object_name': 'SMTPServer'}, |
||||
'headers': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||
'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mails_hour': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), |
||||
'port': ('django.db.models.fields.IntegerField', [], {'default': '25'}), |
||||
'tls': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||
'user': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}) |
||||
}, |
||||
'newsletter.workgroup': { |
||||
'Meta': {'object_name': 'WorkGroup'}, |
||||
'contacts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Contact']", 'null': 'True', 'blank': 'True'}), |
||||
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']"}), |
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||
'mailinglists': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.MailingList']", 'null': 'True', 'blank': 'True'}), |
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||
'newsletters': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['newsletter.Newsletter']", 'null': 'True', 'blank': 'True'}) |
||||
} |
||||
} |
||||
|
||||
complete_apps = ['newsletter'] |
||||
@ -0,0 +1,419 @@ |
||||
# -*- coding: utf-8 -*- |
||||
"""Models for emencia.django.newsletter""" |
||||
from smtplib import SMTP |
||||
from smtplib import SMTPHeloError |
||||
from datetime import datetime |
||||
from datetime import timedelta |
||||
from email.MIMEImage import MIMEImage |
||||
|
||||
from django.core.mail import EmailMessage |
||||
from django.template import Context |
||||
from django.db import models |
||||
from django.contrib.sites.models import Site |
||||
from django.conf import settings |
||||
from django.utils.encoding import smart_str |
||||
from django.core.urlresolvers import reverse |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
from django.contrib.contenttypes import generic |
||||
from django.contrib.contenttypes.models import ContentType |
||||
from django.contrib.auth.models import Group |
||||
from django.utils.encoding import force_unicode |
||||
from django.template.loader import render_to_string, get_template |
||||
|
||||
|
||||
from emencia.django.newsletter.managers import ContactManager |
||||
from emencia.django.newsletter.settings import BASE_PATH |
||||
from emencia.django.newsletter.settings import MAILER_HARD_LIMIT |
||||
from emencia.django.newsletter.settings import DEFAULT_HEADER_REPLY |
||||
from emencia.django.newsletter.settings import DEFAULT_HEADER_SENDER |
||||
from emencia.django.newsletter.settings import ACTIVATION_SUBJECT, ACTIVATION_TEMPLATE |
||||
from emencia.django.newsletter.utils.vcard import vcard_contact_export |
||||
from emencia.django.newsletter.utils import make_activation_code |
||||
|
||||
|
||||
|
||||
class SMTPServer(models.Model): |
||||
"""Configuration of a SMTP server""" |
||||
name = models.CharField(_('name'), max_length=255) |
||||
host = models.CharField(_('server host'), max_length=255) |
||||
user = models.CharField(_('server user'), max_length=128, blank=True, |
||||
help_text=_('Leave it empty if the host is public.')) |
||||
password = models.CharField(_('server password'), max_length=128, blank=True, |
||||
help_text=_('Leave it empty if the host is public.')) |
||||
port = models.IntegerField(_('server port'), default=25) |
||||
tls = models.BooleanField(_('server use TLS')) |
||||
|
||||
headers = models.TextField(_('custom headers'), blank=True, |
||||
help_text=_('key1: value1 key2: value2, splitted by return line.\n'\ |
||||
'Useful for passing some tracking headers if your provider allows it.')) |
||||
mails_hour = models.IntegerField(_('mails per hour'), default=0) |
||||
|
||||
def connect(self): |
||||
"""Connect the SMTP Server""" |
||||
smtp = SMTP(smart_str(self.host), int(self.port)) |
||||
smtp.ehlo_or_helo_if_needed() |
||||
if self.tls: |
||||
smtp.starttls() |
||||
smtp.ehlo_or_helo_if_needed() |
||||
|
||||
if self.user or self.password: |
||||
smtp.login(smart_str(self.user), smart_str(self.password)) |
||||
return smtp |
||||
|
||||
def delay(self): |
||||
"""compute the delay (in seconds) between mails to ensure mails |
||||
per hour limit is not reached |
||||
|
||||
:rtype: float |
||||
""" |
||||
if not self.mails_hour: |
||||
return 0.0 |
||||
else: |
||||
return 3600.0 / self.mails_hour |
||||
|
||||
def credits(self): |
||||
"""Return how many mails the server can send""" |
||||
if not self.mails_hour: |
||||
return MAILER_HARD_LIMIT |
||||
|
||||
last_hour = datetime.now() - timedelta(hours=1) |
||||
sent_last_hour = ContactMailingStatus.objects.filter( |
||||
models.Q(status=ContactMailingStatus.SENT) | |
||||
models.Q(status=ContactMailingStatus.SENT_TEST), |
||||
newsletter__server=self, |
||||
creation_date__gte=last_hour).count() |
||||
return self.mails_hour - sent_last_hour |
||||
|
||||
@property |
||||
def custom_headers(self): |
||||
if self.headers: |
||||
headers = {} |
||||
for header in self.headers.splitlines(): |
||||
if header: |
||||
key, value = header.split(':') |
||||
headers[key.strip()] = value.strip() |
||||
return headers |
||||
return {} |
||||
|
||||
def __unicode__(self): |
||||
return '%s (%s)' % (self.name, self.host) |
||||
|
||||
class Meta: |
||||
verbose_name = _('SMTP server') |
||||
verbose_name_plural = _('SMTP servers') |
||||
|
||||
|
||||
class Contact(models.Model): |
||||
"""Contact for emailing""" |
||||
activation_subject = ACTIVATION_SUBJECT |
||||
activation_template = ACTIVATION_TEMPLATE |
||||
user = models.ForeignKey('accounts.User', null=True) |
||||
email = models.EmailField(_('email'), unique=True) |
||||
first_name = models.CharField(_('first name'), max_length=50, blank=True) |
||||
last_name = models.CharField(_('last name'), max_length=50, blank=True) |
||||
|
||||
subscriber = models.BooleanField(_('subscriber'), default=True) |
||||
valid = models.BooleanField(_('valid email'), default=True) |
||||
tester = models.BooleanField(_('contact tester'), default=False) |
||||
activation_code = models.CharField( |
||||
verbose_name=_('activation code'), max_length=40, |
||||
default=make_activation_code |
||||
) |
||||
activated = models.BooleanField(default=False) |
||||
|
||||
content_type = models.ForeignKey(ContentType, blank=True, null=True) |
||||
object_id = models.PositiveIntegerField(blank=True, null=True) |
||||
content_object = generic.GenericForeignKey('content_type', 'object_id') |
||||
|
||||
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) |
||||
modification_date = models.DateTimeField(_('modification date'), auto_now=True) |
||||
|
||||
objects = ContactManager() |
||||
|
||||
def subscriptions(self): |
||||
"""Return the user subscriptions""" |
||||
return MailingList.objects.filter(subscribers=self) |
||||
|
||||
def unsubscriptions(self): |
||||
"""Return the user unsubscriptions""" |
||||
return MailingList.objects.filter(unsubscribers=self) |
||||
|
||||
def vcard_format(self): |
||||
return vcard_contact_export(self) |
||||
|
||||
def mail_format(self): |
||||
if self.first_name and self.last_name: |
||||
return '%s %s <%s>' % (self.last_name, self.first_name, self.email) |
||||
return self.email |
||||
mail_format.short_description = _('mail format') |
||||
|
||||
def get_absolute_url(self): |
||||
if self.content_type and self.object_id: |
||||
return self.content_object.get_absolute_url() |
||||
return reverse('admin:newsletter_contact_change', args=(self.pk,)) |
||||
|
||||
def __unicode__(self): |
||||
if self.first_name and self.last_name: |
||||
contact_name = '%s %s' % (self.last_name, self.first_name) |
||||
else: |
||||
contact_name = self.email |
||||
return contact_name |
||||
|
||||
def send_activation(self): |
||||
user = self |
||||
site = Site.objects.get_current() |
||||
ctx_dict = {'activation_key': self.activation_code, |
||||
'site': site, |
||||
'user': user} |
||||
subject = render_to_string(self.activation_subject, |
||||
ctx_dict) |
||||
# Email subject *must not* contain newlines |
||||
subject = ''.join(subject.splitlines()) |
||||
|
||||
message = get_template(self.activation_template).render(Context(ctx_dict)) |
||||
msg = EmailMessage(subject, message, settings.DEFAULT_FROM_EMAIL, [user.email]) |
||||
msg.content_subtype = "html" |
||||
images =(('/img/logo_reg.png', 'logo'), |
||||
('/img/soc-medias/sm-icon-rss.png', 'rss'), |
||||
('/img/soc-medias/sm-icon-fb.png', 'fb'), |
||||
('/img/soc-medias/sm-icon-lin.png', 'linkedin'), |
||||
('/img/soc-medias/sm-icon-vk.png', 'vk'), |
||||
('/img/soc-medias/sm-icon-twit.png', 'twit'), |
||||
('/img/mail-logo-2.jpg','logo2')) |
||||
for img in images: |
||||
fp = open(settings.STATIC_ROOT+img[0], 'rb') |
||||
msg_img = MIMEImage(fp.read()) |
||||
fp.close() |
||||
msg_img.add_header('Content-ID', '<'+img[1]+'>') |
||||
msg.attach(msg_img) |
||||
|
||||
msg.send() |
||||
|
||||
class Meta: |
||||
ordering = ('-modification_date',) |
||||
verbose_name = _('contact') |
||||
verbose_name_plural = _('contacts') |
||||
|
||||
|
||||
class ContactSettings(models.Model): |
||||
WEEK = 1 # every week |
||||
WEEK_2 = 2 # every 2 weeks |
||||
MONTH = 3 # every 4 month |
||||
|
||||
PERIODIC_CHOICES = [(WEEK, 'Раз в неделю'), |
||||
(WEEK_2, 'Раз в 2 недели'), |
||||
(MONTH, 'Разв месяц') |
||||
] |
||||
|
||||
contact = models.OneToOneField(Contact) |
||||
periodic = models.PositiveIntegerField(verbose_name=_(u'Периодичность отправки'), choices=PERIODIC_CHOICES, default=WEEK) |
||||
exponent_practicum = models.BooleanField(default=True, verbose_name=_(u'Практикум экспонента')) |
||||
organiser_practicum = models.BooleanField(default=True, verbose_name=_(u'Практикум организатора событий')) |
||||
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=_(u'Тематики')) |
||||
area = models.ManyToManyField('country.Area', blank=True, null=True, verbose_name=_(u'Географические зоны')) |
||||
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=_(u'Страны')) |
||||
city = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=_(u'Города')) |
||||
|
||||
|
||||
class MailingList(models.Model): |
||||
"""Mailing list""" |
||||
name = models.CharField(_('name'), max_length=255) |
||||
description = models.TextField(_('description'), blank=True) |
||||
|
||||
subscribers = models.ManyToManyField(Contact, verbose_name=_('subscribers'), |
||||
related_name='mailinglist_subscriber') |
||||
unsubscribers = models.ManyToManyField(Contact, verbose_name=_('unsubscribers'), |
||||
related_name='mailinglist_unsubscriber', |
||||
null=True, blank=True) |
||||
announce = models.BooleanField(default=False) |
||||
announce_public_day = models.IntegerField(default=2) |
||||
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) |
||||
modification_date = models.DateTimeField(_('modification date'), auto_now=True) |
||||
|
||||
def subscribers_count(self): |
||||
return self.subscribers.all().count() |
||||
subscribers_count.short_description = _('subscribers') |
||||
|
||||
def unsubscribers_count(self): |
||||
return self.unsubscribers.all().count() |
||||
unsubscribers_count.short_description = _('unsubscribers') |
||||
|
||||
def expedition_set(self): |
||||
unsubscribers_id = self.unsubscribers.values_list('id', flat=True) |
||||
return self.subscribers.valid_subscribers().exclude( |
||||
id__in=unsubscribers_id) |
||||
|
||||
def __unicode__(self): |
||||
return self.name |
||||
|
||||
class Meta: |
||||
ordering = ('-creation_date',) |
||||
verbose_name = _('mailing list') |
||||
verbose_name_plural = _('mailing lists') |
||||
|
||||
|
||||
class Newsletter(models.Model): |
||||
"""Newsletter to be sended to contacts""" |
||||
DRAFT = 0 |
||||
WAITING = 1 |
||||
SENDING = 2 |
||||
SENT = 4 |
||||
CANCELED = 5 |
||||
|
||||
STATUS_CHOICES = ((DRAFT, _('draft')), |
||||
(WAITING, _('waiting sending')), |
||||
(SENDING, _('sending')), |
||||
(SENT, _('sent')), |
||||
(CANCELED, _('canceled')), |
||||
) |
||||
|
||||
title = models.CharField(_('title'), max_length=255, |
||||
help_text=_('You can use the "{{ UNIQUE_KEY }}" variable ' \ |
||||
'for unique identifier within the newsletter\'s title.')) |
||||
content = models.TextField(_('content'), help_text=_('Or paste an URL.'), |
||||
default=_('<body>\n<!-- Edit your newsletter here -->\n</body>')) |
||||
|
||||
mailing_list = models.ForeignKey(MailingList, verbose_name=_('mailing list')) |
||||
test_contacts = models.ManyToManyField(Contact, verbose_name=_('test contacts'), |
||||
blank=True, null=True) |
||||
|
||||
server = models.ForeignKey(SMTPServer, verbose_name=_('smtp server'), |
||||
default=lambda: SMTPServer.objects.get(id=1)) |
||||
header_sender = models.CharField(_('sender'), max_length=255, |
||||
default=DEFAULT_HEADER_SENDER) |
||||
header_reply = models.CharField(_('reply to'), max_length=255, |
||||
default=DEFAULT_HEADER_REPLY) |
||||
|
||||
status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=DRAFT) |
||||
sending_date = models.DateTimeField(_('sending date'), default=datetime.now) |
||||
|
||||
slug = models.SlugField(help_text=_('Used for displaying the newsletter on the site.'), |
||||
unique=True) |
||||
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) |
||||
modification_date = models.DateTimeField(_('modification date'), auto_now=True) |
||||
|
||||
def mails_sent(self): |
||||
return self.contactmailingstatus_set.filter(status=ContactMailingStatus.SENT).count() |
||||
|
||||
@models.permalink |
||||
def get_absolute_url(self): |
||||
return ('newsletter_newsletter_preview', (self.slug,)) |
||||
|
||||
@models.permalink |
||||
def get_historic_url(self): |
||||
return ('newsletter_newsletter_historic', (self.slug,)) |
||||
|
||||
@models.permalink |
||||
def get_statistics_url(self): |
||||
return ('newsletter_newsletter_statistics', (self.slug,)) |
||||
|
||||
def __unicode__(self): |
||||
return self.title |
||||
|
||||
class Meta: |
||||
ordering = ('-creation_date',) |
||||
verbose_name = _('newsletter') |
||||
verbose_name_plural = _('newsletters') |
||||
permissions = (('can_change_status', 'Can change status'),) |
||||
|
||||
|
||||
class Link(models.Model): |
||||
"""Link sended in a newsletter""" |
||||
title = models.CharField(_('title'), max_length=255) |
||||
url = models.CharField(_('url'), max_length=255) |
||||
|
||||
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) |
||||
|
||||
def get_absolute_url(self): |
||||
return self.url |
||||
|
||||
def __unicode__(self): |
||||
return self.title |
||||
|
||||
class Meta: |
||||
ordering = ('-creation_date',) |
||||
verbose_name = _('link') |
||||
verbose_name_plural = _('links') |
||||
|
||||
|
||||
class Attachment(models.Model): |
||||
"""Attachment file in a newsletter""" |
||||
|
||||
def get_newsletter_storage_path(self, filename): |
||||
filename = force_unicode(filename) |
||||
return '/'.join([BASE_PATH, self.newsletter.slug, filename]) |
||||
|
||||
newsletter = models.ForeignKey(Newsletter, verbose_name=_('newsletter')) |
||||
title = models.CharField(_('title'), max_length=255) |
||||
file_attachment = models.FileField(_('file to attach'), max_length=255, |
||||
upload_to=get_newsletter_storage_path) |
||||
|
||||
class Meta: |
||||
verbose_name = _('attachment') |
||||
verbose_name_plural = _('attachments') |
||||
|
||||
def __unicode__(self): |
||||
return self.title |
||||
|
||||
def get_absolute_url(self): |
||||
return self.file_attachment.url |
||||
|
||||
|
||||
class ContactMailingStatus(models.Model): |
||||
"""Status of the reception""" |
||||
SENT_TEST = -1 |
||||
SENT = 0 |
||||
ERROR = 1 |
||||
INVALID = 2 |
||||
OPENED = 4 |
||||
OPENED_ON_SITE = 5 |
||||
LINK_OPENED = 6 |
||||
UNSUBSCRIPTION = 7 |
||||
|
||||
STATUS_CHOICES = ((SENT_TEST, _('sent in test')), |
||||
(SENT, _('sent')), |
||||
(ERROR, _('error')), |
||||
(INVALID, _('invalid email')), |
||||
(OPENED, _('opened')), |
||||
(OPENED_ON_SITE, _('opened on site')), |
||||
(LINK_OPENED, _('link opened')), |
||||
(UNSUBSCRIPTION, _('unsubscription')), |
||||
) |
||||
|
||||
newsletter = models.ForeignKey(Newsletter, verbose_name=_('newsletter')) |
||||
contact = models.ForeignKey(Contact, verbose_name=_('contact')) |
||||
status = models.IntegerField(_('status'), choices=STATUS_CHOICES) |
||||
link = models.ForeignKey(Link, verbose_name=_('link'), |
||||
blank=True, null=True) |
||||
|
||||
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) |
||||
|
||||
def __unicode__(self): |
||||
return '%s : %s : %s' % (self.newsletter.__unicode__(), |
||||
self.contact.__unicode__(), |
||||
self.get_status_display()) |
||||
|
||||
class Meta: |
||||
ordering = ('-creation_date',) |
||||
verbose_name = _('contact mailing status') |
||||
verbose_name_plural = _('contact mailing statuses') |
||||
|
||||
|
||||
class WorkGroup(models.Model): |
||||
"""Work Group for privatization of the ressources""" |
||||
name = models.CharField(_('name'), max_length=255) |
||||
group = models.ForeignKey(Group, verbose_name=_('permissions group')) |
||||
|
||||
contacts = models.ManyToManyField(Contact, verbose_name=_('contacts'), |
||||
blank=True, null=True) |
||||
mailinglists = models.ManyToManyField(MailingList, verbose_name=_('mailing lists'), |
||||
blank=True, null=True) |
||||
newsletters = models.ManyToManyField(Newsletter, verbose_name=_('newsletters'), |
||||
blank=True, null=True) |
||||
|
||||
def __unicode__(self): |
||||
return self.name |
||||
|
||||
class Meta: |
||||
verbose_name = _('workgroup') |
||||
verbose_name_plural = _('workgroups') |
||||
@ -0,0 +1,43 @@ |
||||
"""Settings for emencia.django.newsletter""" |
||||
import string |
||||
from django.conf import settings |
||||
|
||||
BASE64_IMAGES = { |
||||
'gif': 'AJEAAAAAAP///////wAAACH5BAEHAAIALAAAAAABAAEAAAICVAEAOw==', |
||||
'png': 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABBJREFUeNpi+P//PwNAgAEACPwC/tuiTRYAAAAASUVORK5CYII=', |
||||
'jpg': '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwODxAPDgwTExQUExMcGxsbHCAgICAgICAgICD/2wBDAQcHBw0MDRgQEBgaFREVGiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/wAARCAABAAEDAREAAhEBAxEB/8QAFAABAAAAAAAAAAAAAAAAAAAACP/EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AVIP/2Q==' |
||||
} |
||||
|
||||
USE_WORKGROUPS = getattr(settings, 'NEWSLETTER_USE_WORKGROUPS', False) |
||||
USE_UTM_TAGS = getattr(settings, 'NEWSLETTER_USE_UTM_TAGS', True) |
||||
USE_TINYMCE = getattr(settings, 'NEWSLETTER_USE_TINYMCE', |
||||
'tinymce' in settings.INSTALLED_APPS) |
||||
|
||||
USE_PRETTIFY = getattr(settings, 'NEWSLETTER_USE_PRETTIFY', True) |
||||
|
||||
MAILER_HARD_LIMIT = getattr(settings, 'NEWSLETTER_MAILER_HARD_LIMIT', 100) |
||||
|
||||
INCLUDE_UNSUBSCRIPTION = getattr(settings, 'NEWSLETTER_INCLUDE_UNSUBSCRIPTION', True) |
||||
|
||||
UNIQUE_KEY_LENGTH = getattr(settings, 'NEWSLETTER_UNIQUE_KEY_LENGTH', 8) |
||||
UNIQUE_KEY_CHAR_SET = getattr(settings, 'NEWSLETTER_UNIQUE_KEY_CHAR_SET', string.ascii_uppercase + string.digits) |
||||
|
||||
DEFAULT_HEADER_SENDER = getattr(settings, 'NEWSLETTER_DEFAULT_HEADER_SENDER', |
||||
'Expomap<mail@expomap.ru>') |
||||
DEFAULT_HEADER_REPLY = getattr(settings, 'NEWSLETTER_DEFAULT_HEADER_REPLY', |
||||
DEFAULT_HEADER_SENDER) |
||||
|
||||
TRACKING_LINKS = getattr(settings, 'NEWSLETTER_TRACKING_LINKS', True) |
||||
TRACKING_IMAGE_FORMAT = getattr(settings, 'NEWSLETTER_TRACKING_IMAGE_FORMAT', 'jpg') |
||||
TRACKING_IMAGE = getattr(settings, 'NEWSLETTER_TRACKING_IMAGE', |
||||
BASE64_IMAGES[TRACKING_IMAGE_FORMAT]) |
||||
|
||||
SLEEP_BETWEEN_SENDING = getattr( |
||||
settings, 'NEWSLETTER_SLEEP_BETWEEN_SENDING', 10) |
||||
RESTART_CONNECTION_BETWEEN_SENDING = getattr( |
||||
settings, 'NEWSLETTER_RESTART_CONNECTION_BETWEEN_SENDING', False) |
||||
|
||||
BASE_PATH = getattr(settings, 'NEWSLETTER_BASE_PATH', 'uploads/newsletter') |
||||
|
||||
ACTIVATION_SUBJECT = 'client/newsletters/activation_subject.txt' |
||||
ACTIVATION_TEMPLATE = 'client/newsletters/activation_template.html' |
||||
@ -0,0 +1,660 @@ |
||||
/* |
||||
* jQuery Form Plugin |
||||
* version: 2.36 (07-NOV-2009) |
||||
* @requires jQuery v1.2.6 or later |
||||
* |
||||
* Examples and documentation at: http://malsup.com/jquery/form/
|
||||
* Dual licensed under the MIT and GPL licenses: |
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/ |
||||
;(function($) { |
||||
|
||||
/* |
||||
Usage Note: |
||||
----------- |
||||
Do not use both ajaxSubmit and ajaxForm on the same form. These |
||||
functions are intended to be exclusive. Use ajaxSubmit if you want |
||||
to bind your own submit handler to the form. For example, |
||||
|
||||
$(document).ready(function() { |
||||
$('#myForm').bind('submit', function() { |
||||
$(this).ajaxSubmit({ |
||||
target: '#output' |
||||
}); |
||||
return false; // <-- important!
|
||||
}); |
||||
}); |
||||
|
||||
Use ajaxForm when you want the plugin to manage all the event binding |
||||
for you. For example, |
||||
|
||||
$(document).ready(function() { |
||||
$('#myForm').ajaxForm({ |
||||
target: '#output' |
||||
}); |
||||
}); |
||||
|
||||
When using ajaxForm, the ajaxSubmit function will be invoked for you |
||||
at the appropriate time. |
||||
*/ |
||||
|
||||
/** |
||||
* ajaxSubmit() provides a mechanism for immediately submitting |
||||
* an HTML form using AJAX. |
||||
*/ |
||||
$.fn.ajaxSubmit = function(options) { |
||||
// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
|
||||
if (!this.length) { |
||||
log('ajaxSubmit: skipping submit process - no element selected'); |
||||
return this; |
||||
} |
||||
|
||||
if (typeof options == 'function') |
||||
options = { success: options }; |
||||
|
||||
var url = $.trim(this.attr('action')); |
||||
if (url) { |
||||
// clean url (don't include hash vaue)
|
||||
url = (url.match(/^([^#]+)/)||[])[1]; |
||||
} |
||||
url = url || window.location.href || ''; |
||||
|
||||
options = $.extend({ |
||||
url: url, |
||||
type: this.attr('method') || 'GET', |
||||
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' |
||||
}, options || {}); |
||||
|
||||
// hook for manipulating the form data before it is extracted;
|
||||
// convenient for use with rich editors like tinyMCE or FCKEditor
|
||||
var veto = {}; |
||||
this.trigger('form-pre-serialize', [this, options, veto]); |
||||
if (veto.veto) { |
||||
log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); |
||||
return this; |
||||
} |
||||
|
||||
// provide opportunity to alter form data before it is serialized
|
||||
if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { |
||||
log('ajaxSubmit: submit aborted via beforeSerialize callback'); |
||||
return this; |
||||
} |
||||
|
||||
var a = this.formToArray(options.semantic); |
||||
if (options.data) { |
||||
options.extraData = options.data; |
||||
for (var n in options.data) { |
||||
if(options.data[n] instanceof Array) { |
||||
for (var k in options.data[n]) |
||||
a.push( { name: n, value: options.data[n][k] } ); |
||||
} |
||||
else |
||||
a.push( { name: n, value: options.data[n] } ); |
||||
} |
||||
} |
||||
|
||||
// give pre-submit callback an opportunity to abort the submit
|
||||
if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { |
||||
log('ajaxSubmit: submit aborted via beforeSubmit callback'); |
||||
return this; |
||||
} |
||||
|
||||
// fire vetoable 'validate' event
|
||||
this.trigger('form-submit-validate', [a, this, options, veto]); |
||||
if (veto.veto) { |
||||
log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); |
||||
return this; |
||||
} |
||||
|
||||
var q = $.param(a); |
||||
|
||||
if (options.type.toUpperCase() == 'GET') { |
||||
options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; |
||||
options.data = null; // data is null for 'get'
|
||||
} |
||||
else |
||||
options.data = q; // data is the query string for 'post'
|
||||
|
||||
var $form = this, callbacks = []; |
||||
if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); |
||||
if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); |
||||
|
||||
// perform a load on the target only if dataType is not provided
|
||||
if (!options.dataType && options.target) { |
||||
var oldSuccess = options.success || function(){}; |
||||
callbacks.push(function(data) { |
||||
$(options.target).html(data).each(oldSuccess, arguments); |
||||
}); |
||||
} |
||||
else if (options.success) |
||||
callbacks.push(options.success); |
||||
|
||||
options.success = function(data, status) { |
||||
for (var i=0, max=callbacks.length; i < max; i++) |
||||
callbacks[i].apply(options, [data, status, $form]); |
||||
}; |
||||
|
||||
// are there files to upload?
|
||||
var files = $('input:file', this).fieldValue(); |
||||
var found = false; |
||||
for (var j=0; j < files.length; j++) |
||||
if (files[j]) |
||||
found = true; |
||||
|
||||
var multipart = false; |
||||
// var mp = 'multipart/form-data';
|
||||
// multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
|
||||
|
||||
// options.iframe allows user to force iframe mode
|
||||
// 06-NOV-09: now defaulting to iframe mode if file input is detected
|
||||
if ((files.length && options.iframe !== false) || options.iframe || found || multipart) { |
||||
// hack to fix Safari hang (thanks to Tim Molendijk for this)
|
||||
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
|
||||
if (options.closeKeepAlive) |
||||
$.get(options.closeKeepAlive, fileUpload); |
||||
else |
||||
fileUpload(); |
||||
} |
||||
else |
||||
$.ajax(options); |
||||
|
||||
// fire 'notify' event
|
||||
this.trigger('form-submit-notify', [this, options]); |
||||
return this; |
||||
|
||||
|
||||
// private function for handling file uploads (hat tip to YAHOO!)
|
||||
function fileUpload() { |
||||
var form = $form[0]; |
||||
|
||||
if ($(':input[name=submit]', form).length) { |
||||
alert('Error: Form elements must not be named "submit".'); |
||||
return; |
||||
} |
||||
|
||||
var opts = $.extend({}, $.ajaxSettings, options); |
||||
var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts); |
||||
|
||||
var id = 'jqFormIO' + (new Date().getTime()); |
||||
var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />'); |
||||
var io = $io[0]; |
||||
|
||||
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); |
||||
|
||||
var xhr = { // mock object
|
||||
aborted: 0, |
||||
responseText: null, |
||||
responseXML: null, |
||||
status: 0, |
||||
statusText: 'n/a', |
||||
getAllResponseHeaders: function() {}, |
||||
getResponseHeader: function() {}, |
||||
setRequestHeader: function() {}, |
||||
abort: function() { |
||||
this.aborted = 1; |
||||
$io.attr('src', opts.iframeSrc); // abort op in progress
|
||||
} |
||||
}; |
||||
|
||||
var g = opts.global; |
||||
// trigger ajax global events so that activity/block indicators work like normal
|
||||
if (g && ! $.active++) $.event.trigger("ajaxStart"); |
||||
if (g) $.event.trigger("ajaxSend", [xhr, opts]); |
||||
|
||||
if (s.beforeSend && s.beforeSend(xhr, s) === false) { |
||||
s.global && $.active--; |
||||
return; |
||||
} |
||||
if (xhr.aborted) |
||||
return; |
||||
|
||||
var cbInvoked = 0; |
||||
var timedOut = 0; |
||||
|
||||
// add submitting element to data if we know it
|
||||
var sub = form.clk; |
||||
if (sub) { |
||||
var n = sub.name; |
||||
if (n && !sub.disabled) { |
||||
options.extraData = options.extraData || {}; |
||||
options.extraData[n] = sub.value; |
||||
if (sub.type == "image") { |
||||
options.extraData[name+'.x'] = form.clk_x; |
||||
options.extraData[name+'.y'] = form.clk_y; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// take a breath so that pending repaints get some cpu time before the upload starts
|
||||
setTimeout(function() { |
||||
// make sure form attrs are set
|
||||
var t = $form.attr('target'), a = $form.attr('action'); |
||||
|
||||
// update form attrs in IE friendly way
|
||||
form.setAttribute('target',id); |
||||
if (form.getAttribute('method') != 'POST') |
||||
form.setAttribute('method', 'POST'); |
||||
if (form.getAttribute('action') != opts.url) |
||||
form.setAttribute('action', opts.url); |
||||
|
||||
// ie borks in some cases when setting encoding
|
||||
if (! options.skipEncodingOverride) { |
||||
$form.attr({ |
||||
encoding: 'multipart/form-data', |
||||
enctype: 'multipart/form-data' |
||||
}); |
||||
} |
||||
|
||||
// support timout
|
||||
if (opts.timeout) |
||||
setTimeout(function() { timedOut = true; cb(); }, opts.timeout); |
||||
|
||||
// add "extra" data to form if provided in options
|
||||
var extraInputs = []; |
||||
try { |
||||
if (options.extraData) |
||||
for (var n in options.extraData) |
||||
extraInputs.push( |
||||
$('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />') |
||||
.appendTo(form)[0]); |
||||
|
||||
// add iframe to doc and submit the form
|
||||
$io.appendTo('body'); |
||||
io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); |
||||
form.submit(); |
||||
} |
||||
finally { |
||||
// reset attrs and remove "extra" input elements
|
||||
form.setAttribute('action',a); |
||||
t ? form.setAttribute('target', t) : $form.removeAttr('target'); |
||||
$(extraInputs).remove(); |
||||
} |
||||
}, 10); |
||||
|
||||
var domCheckCount = 50; |
||||
|
||||
function cb() { |
||||
if (cbInvoked++) return; |
||||
|
||||
io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); |
||||
|
||||
var ok = true; |
||||
try { |
||||
if (timedOut) throw 'timeout'; |
||||
// extract the server response from the iframe
|
||||
var data, doc; |
||||
|
||||
doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document; |
||||
|
||||
var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); |
||||
log('isXml='+isXml); |
||||
if (!isXml && (doc.body == null || doc.body.innerHTML == '')) { |
||||
if (--domCheckCount) { |
||||
// in some browsers (Opera) the iframe DOM is not always traversable when
|
||||
// the onload callback fires, so we loop a bit to accommodate
|
||||
cbInvoked = 0; |
||||
setTimeout(cb, 100); |
||||
return; |
||||
} |
||||
log('Could not access iframe DOM after 50 tries.'); |
||||
return; |
||||
} |
||||
|
||||
xhr.responseText = doc.body ? doc.body.innerHTML : null; |
||||
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; |
||||
xhr.getResponseHeader = function(header){ |
||||
var headers = {'content-type': opts.dataType}; |
||||
return headers[header]; |
||||
}; |
||||
|
||||
if (opts.dataType == 'json' || opts.dataType == 'script') { |
||||
// see if user embedded response in textarea
|
||||
var ta = doc.getElementsByTagName('textarea')[0]; |
||||
if (ta) |
||||
xhr.responseText = ta.value; |
||||
else { |
||||
// account for browsers injecting pre around json response
|
||||
var pre = doc.getElementsByTagName('pre')[0]; |
||||
if (pre) |
||||
xhr.responseText = pre.innerHTML; |
||||
}
|
||||
} |
||||
else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) { |
||||
xhr.responseXML = toXml(xhr.responseText); |
||||
} |
||||
data = $.httpData(xhr, opts.dataType); |
||||
} |
||||
catch(e){ |
||||
ok = false; |
||||
$.handleError(opts, xhr, 'error', e); |
||||
} |
||||
|
||||
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
|
||||
if (ok) { |
||||
opts.success(data, 'success'); |
||||
if (g) $.event.trigger("ajaxSuccess", [xhr, opts]); |
||||
} |
||||
if (g) $.event.trigger("ajaxComplete", [xhr, opts]); |
||||
if (g && ! --$.active) $.event.trigger("ajaxStop"); |
||||
if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error'); |
||||
|
||||
// clean up
|
||||
setTimeout(function() { |
||||
$io.remove(); |
||||
xhr.responseXML = null; |
||||
}, 100); |
||||
}; |
||||
|
||||
function toXml(s, doc) { |
||||
if (window.ActiveXObject) { |
||||
doc = new ActiveXObject('Microsoft.XMLDOM'); |
||||
doc.async = 'false'; |
||||
doc.loadXML(s); |
||||
} |
||||
else |
||||
doc = (new DOMParser()).parseFromString(s, 'text/xml'); |
||||
return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
/** |
||||
* ajaxForm() provides a mechanism for fully automating form submission. |
||||
* |
||||
* The advantages of using this method instead of ajaxSubmit() are: |
||||
* |
||||
* 1: This method will include coordinates for <input type="image" /> elements (if the element |
||||
* is used to submit the form). |
||||
* 2. This method will include the submit element's name/value data (for the element that was |
||||
* used to submit the form). |
||||
* 3. This method binds the submit() method to the form for you. |
||||
* |
||||
* The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely |
||||
* passes the options argument along after properly binding events for submit elements and |
||||
* the form itself. |
||||
*/ |
||||
$.fn.ajaxForm = function(options) { |
||||
return this.ajaxFormUnbind().bind('submit.form-plugin', function() { |
||||
$(this).ajaxSubmit(options); |
||||
return false; |
||||
}).bind('click.form-plugin', function(e) { |
||||
var target = e.target; |
||||
var $el = $(target); |
||||
if (!($el.is(":submit,input:image"))) { |
||||
// is this a child element of the submit el? (ex: a span within a button)
|
||||
var t = $el.closest(':submit'); |
||||
if (t.length == 0) |
||||
return; |
||||
target = t[0]; |
||||
} |
||||
var form = this; |
||||
form.clk = target; |
||||
if (target.type == 'image') { |
||||
if (e.offsetX != undefined) { |
||||
form.clk_x = e.offsetX; |
||||
form.clk_y = e.offsetY; |
||||
} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
|
||||
var offset = $el.offset(); |
||||
form.clk_x = e.pageX - offset.left; |
||||
form.clk_y = e.pageY - offset.top; |
||||
} else { |
||||
form.clk_x = e.pageX - target.offsetLeft; |
||||
form.clk_y = e.pageY - target.offsetTop; |
||||
} |
||||
} |
||||
// clear form vars
|
||||
setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100); |
||||
}); |
||||
}; |
||||
|
||||
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
|
||||
$.fn.ajaxFormUnbind = function() { |
||||
return this.unbind('submit.form-plugin click.form-plugin'); |
||||
}; |
||||
|
||||
/** |
||||
* formToArray() gathers form element data into an array of objects that can |
||||
* be passed to any of the following ajax functions: $.get, $.post, or load. |
||||
* Each object in the array has both a 'name' and 'value' property. An example of |
||||
* an array for a simple login form might be: |
||||
* |
||||
* [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] |
||||
* |
||||
* It is this array that is passed to pre-submit callback functions provided to the |
||||
* ajaxSubmit() and ajaxForm() methods. |
||||
*/ |
||||
$.fn.formToArray = function(semantic) { |
||||
var a = []; |
||||
if (this.length == 0) return a; |
||||
|
||||
var form = this[0]; |
||||
var els = semantic ? form.getElementsByTagName('*') : form.elements; |
||||
if (!els) return a; |
||||
for(var i=0, max=els.length; i < max; i++) { |
||||
var el = els[i]; |
||||
var n = el.name; |
||||
if (!n) continue; |
||||
|
||||
if (semantic && form.clk && el.type == "image") { |
||||
// handle image inputs on the fly when semantic == true
|
||||
if(!el.disabled && form.clk == el) { |
||||
a.push({name: n, value: $(el).val()}); |
||||
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); |
||||
} |
||||
continue; |
||||
} |
||||
|
||||
var v = $.fieldValue(el, true); |
||||
if (v && v.constructor == Array) { |
||||
for(var j=0, jmax=v.length; j < jmax; j++) |
||||
a.push({name: n, value: v[j]}); |
||||
} |
||||
else if (v !== null && typeof v != 'undefined') |
||||
a.push({name: n, value: v}); |
||||
} |
||||
|
||||
if (!semantic && form.clk) { |
||||
// input type=='image' are not found in elements array! handle it here
|
||||
var $input = $(form.clk), input = $input[0], n = input.name; |
||||
if (n && !input.disabled && input.type == 'image') { |
||||
a.push({name: n, value: $input.val()}); |
||||
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); |
||||
} |
||||
} |
||||
return a; |
||||
}; |
||||
|
||||
/** |
||||
* Serializes form data into a 'submittable' string. This method will return a string |
||||
* in the format: name1=value1&name2=value2 |
||||
*/ |
||||
$.fn.formSerialize = function(semantic) { |
||||
//hand off to jQuery.param for proper encoding
|
||||
return $.param(this.formToArray(semantic)); |
||||
}; |
||||
|
||||
/** |
||||
* Serializes all field elements in the jQuery object into a query string. |
||||
* This method will return a string in the format: name1=value1&name2=value2 |
||||
*/ |
||||
$.fn.fieldSerialize = function(successful) { |
||||
var a = []; |
||||
this.each(function() { |
||||
var n = this.name; |
||||
if (!n) return; |
||||
var v = $.fieldValue(this, successful); |
||||
if (v && v.constructor == Array) { |
||||
for (var i=0,max=v.length; i < max; i++) |
||||
a.push({name: n, value: v[i]}); |
||||
} |
||||
else if (v !== null && typeof v != 'undefined') |
||||
a.push({name: this.name, value: v}); |
||||
}); |
||||
//hand off to jQuery.param for proper encoding
|
||||
return $.param(a); |
||||
}; |
||||
|
||||
/** |
||||
* Returns the value(s) of the element in the matched set. For example, consider the following form: |
||||
* |
||||
* <form><fieldset> |
||||
* <input name="A" type="text" /> |
||||
* <input name="A" type="text" /> |
||||
* <input name="B" type="checkbox" value="B1" /> |
||||
* <input name="B" type="checkbox" value="B2"/> |
||||
* <input name="C" type="radio" value="C1" /> |
||||
* <input name="C" type="radio" value="C2" /> |
||||
* </fieldset></form> |
||||
* |
||||
* var v = $(':text').fieldValue(); |
||||
* // if no values are entered into the text inputs
|
||||
* v == ['',''] |
||||
* // if values entered into the text inputs are 'foo' and 'bar'
|
||||
* v == ['foo','bar'] |
||||
* |
||||
* var v = $(':checkbox').fieldValue(); |
||||
* // if neither checkbox is checked
|
||||
* v === undefined |
||||
* // if both checkboxes are checked
|
||||
* v == ['B1', 'B2'] |
||||
* |
||||
* var v = $(':radio').fieldValue(); |
||||
* // if neither radio is checked
|
||||
* v === undefined |
||||
* // if first radio is checked
|
||||
* v == ['C1'] |
||||
* |
||||
* The successful argument controls whether or not the field element must be 'successful' |
||||
* (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
|
||||
* The default value of the successful argument is true. If this value is false the value(s) |
||||
* for each element is returned. |
||||
* |
||||
* Note: This method *always* returns an array. If no valid value can be determined the |
||||
* array will be empty, otherwise it will contain one or more values. |
||||
*/ |
||||
$.fn.fieldValue = function(successful) { |
||||
for (var val=[], i=0, max=this.length; i < max; i++) { |
||||
var el = this[i]; |
||||
var v = $.fieldValue(el, successful); |
||||
if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) |
||||
continue; |
||||
v.constructor == Array ? $.merge(val, v) : val.push(v); |
||||
} |
||||
return val; |
||||
}; |
||||
|
||||
/** |
||||
* Returns the value of the field element. |
||||
*/ |
||||
$.fieldValue = function(el, successful) { |
||||
var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); |
||||
if (typeof successful == 'undefined') successful = true; |
||||
|
||||
if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || |
||||
(t == 'checkbox' || t == 'radio') && !el.checked || |
||||
(t == 'submit' || t == 'image') && el.form && el.form.clk != el || |
||||
tag == 'select' && el.selectedIndex == -1)) |
||||
return null; |
||||
|
||||
if (tag == 'select') { |
||||
var index = el.selectedIndex; |
||||
if (index < 0) return null; |
||||
var a = [], ops = el.options; |
||||
var one = (t == 'select-one'); |
||||
var max = (one ? index+1 : ops.length); |
||||
for(var i=(one ? index : 0); i < max; i++) { |
||||
var op = ops[i]; |
||||
if (op.selected) { |
||||
var v = op.value; |
||||
if (!v) // extra pain for IE...
|
||||
v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value; |
||||
if (one) return v; |
||||
a.push(v); |
||||
} |
||||
} |
||||
return a; |
||||
} |
||||
return el.value; |
||||
}; |
||||
|
||||
/** |
||||
* Clears the form data. Takes the following actions on the form's input fields: |
||||
* - input text fields will have their 'value' property set to the empty string |
||||
* - select elements will have their 'selectedIndex' property set to -1 |
||||
* - checkbox and radio inputs will have their 'checked' property set to false |
||||
* - inputs of type submit, button, reset, and hidden will *not* be effected |
||||
* - button elements will *not* be effected |
||||
*/ |
||||
$.fn.clearForm = function() { |
||||
return this.each(function() { |
||||
$('input,select,textarea', this).clearFields(); |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* Clears the selected form elements. |
||||
*/ |
||||
$.fn.clearFields = $.fn.clearInputs = function() { |
||||
return this.each(function() { |
||||
var t = this.type, tag = this.tagName.toLowerCase(); |
||||
if (t == 'text' || t == 'password' || tag == 'textarea') |
||||
this.value = ''; |
||||
else if (t == 'checkbox' || t == 'radio') |
||||
this.checked = false; |
||||
else if (tag == 'select') |
||||
this.selectedIndex = -1; |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* Resets the form data. Causes all form elements to be reset to their original value. |
||||
*/ |
||||
$.fn.resetForm = function() { |
||||
return this.each(function() { |
||||
// guard against an input with the name of 'reset'
|
||||
// note that IE reports the reset function as an 'object'
|
||||
if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) |
||||
this.reset(); |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* Enables or disables any matching elements. |
||||
*/ |
||||
$.fn.enable = function(b) { |
||||
if (b == undefined) b = true; |
||||
return this.each(function() { |
||||
this.disabled = !b; |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* Checks/unchecks any matching checkboxes or radio buttons and |
||||
* selects/deselects and matching option elements. |
||||
*/ |
||||
$.fn.selected = function(select) { |
||||
if (select == undefined) select = true; |
||||
return this.each(function() { |
||||
var t = this.type; |
||||
if (t == 'checkbox' || t == 'radio') |
||||
this.checked = select; |
||||
else if (this.tagName.toLowerCase() == 'option') { |
||||
var $sel = $(this).parent('select'); |
||||
if (select && $sel[0] && $sel[0].type == 'select-one') { |
||||
// deselect all other options
|
||||
$sel.find('option').selected(false); |
||||
} |
||||
this.selected = select; |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
// helper fn for console logging
|
||||
// set $.fn.ajaxSubmit.debug to true to enable debug logging
|
||||
function log() { |
||||
if ($.fn.ajaxSubmit.debug && window.console && window.console.log) |
||||
window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,'')); |
||||
}; |
||||
|
||||
})(jQuery); |
||||
@ -0,0 +1,7 @@ |
||||
/* |
||||
HeatColor, by Josh Nathanson |
||||
A plugin for jQuery |
||||
Complete documentation at http://www.jnathanson.com/blog/client/jquery/heatcolor/index.cfm
|
||||
*/ |
||||
|
||||
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('p.V.10=9(j,k){4 l={M:9(){v p(8)},q:0,t:0,N:0.Z,F:\'E\',y:X};u(k){p.W(l,k)};4 m={K:9(a,c,d){4 e=(a-c)/(d-c);4 f=l.F==\'E\'?0.5*e+1.7*(1-e):e+0.2+5.5*(1-e);4 h=Y;4 i=2*6.A;4 x=f+e*i;x=l.F!=\'E\'?-x:x;4 r=8.w(6.z((6.D(x)+1)*h));4 g=8.w(6.z((6.D(x+6.A/2)+1)*h));4 b=8.w(6.z((6.D(x+6.A)+1)*h));v\'#\'+r+g+b},w:9(a){4 n=6.z(a+l.N*(U-a));4 s=n.T(S);s=s.C==1?\'0\'+s:s;v s},J:9(c){4 d=[];c.I(9(){d.R(j.B(p(8)))});d=d.Q(9(a,b){v a-b});l.t=!l.y?d[d.C-1]:d[0];l.q=!l.y?d[0]:d[d.C-1]}};u(!l.q&&!l.t)m.J(p(8));H u(l.y){4 o=l.q;l.q=l.t;l.t=o}p(8).I(9(){4 a=p(8);4 b=j.B(a);4 c=m.K(b,l.q,l.t);4 d=l.M.B(a);u(d[0].L==1)d.O("P-G",c);H u(d[0].L==3)d.O("G",c)});v(8)}',62,63,'||||var||Math||this|function||||||||||||||||jQuery|minval|||maxval|if|return|process||reverseOrder|floor|PI|apply|length|cos|roygbiv|colorStyle|color|else|each|setMaxAndMin|findcolor|nodeType|elementFunction|lightness|css|background|sort|push|16|toString|256|fn|extend|false|128|75|heatcolor'.split('|'),0,{})) |
||||
@ -0,0 +1,152 @@ |
||||
/*! |
||||
* jQuery JavaScript Library v1.4.1 |
||||
* 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: Mon Jan 25 19:43:33 2010 -0500 |
||||
*/ |
||||
(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(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,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n<j;n++)e(a[n],b,f?d.call(a[n],n,e(a[n],b)):d,i);return a}return j? |
||||
e(a[0],b):null}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function ma(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function na(a){var b,d=[],f=[],e=arguments,i,j,n,o,m,s,x=c.extend({},c.data(this,"events").live);if(!(a.button&&a.type==="click")){for(o in x){j=x[o];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f, |
||||
a.currentTarget);m=0;for(s=i.length;m<s;m++)for(o in x){j=x[o];n=i[m].elem;f=null;if(i[m].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==n)d.push({elem:n,fn:j})}}m=0;for(s=d.length;m<s;m++){i=d[m];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}}function oa(a,b){return"live."+(a?a+".":"")+b.replace(/\./g,"`").replace(/ /g,"&")}function pa(a){return!a||!a.parentNode||a.parentNode.nodeType=== |
||||
11}function qa(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ra(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0&&(c.support.checkClone||!sa.test(a[0]))){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:r;f=b.createDocumentFragment(); |
||||
c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=i?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(ta.concat.apply([],ta.slice(0,b)),function(){d[this]=a});return d}function ua(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Na=z.jQuery,Oa=z.$,r=z.document,S,Pa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent, |
||||
va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=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(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]], |
||||
[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a, |
||||
this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this, |
||||
a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.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(Q.apply(this,arguments),"slice",Q.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,i,j,n;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<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];n=e[i];if(a!==n)if(f&&n&&(c.isPlainObject(n)||c.isArray(n))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(n)?[]:{};a[i]=c.extend(f,j,n)}else if(n!==v)a[i]=n}return a};c.extend({noConflict:function(a){z.$= |
||||
Oa;if(a)z.jQuery=Na;return c},isReady:false,ready:function(){if(!c.isReady){if(!r.body)return setTimeout(c.ready,13);c.isReady=true;if(P){for(var a,b=0;a=P[b++];)a.call(r,c);P=null}c.fn.triggerHandler&&c(r).triggerHandler("ready")}},bindReady:function(){if(!va){va=true;if(r.readyState==="complete")return c.ready();if(r.addEventListener){r.addEventListener("DOMContentLoaded",L,false);z.addEventListener("load",c.ready,false)}else if(r.attachEvent){r.attachEvent("onreadystatechange",L);z.attachEvent("onload", |
||||
c.ready);var a=false;try{a=z.frameElement==null}catch(b){}r.documentElement.doScroll&&a&&la()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===v||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false; |
||||
return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return z.JSON&&z.JSON.parse?z.JSON.parse(a):(new Function("return "+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Ra.test(a)){var b=r.getElementsByTagName("head")[0]|| |
||||
r.documentElement,d=r.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(r.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===v||c.isFunction(a);if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d= |
||||
a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Sa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!== |
||||
v;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=v}else if(b&&!c.isFunction(b)){d=b;b=v}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b}, |
||||
uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});O=c.uaMatch(O);if(O.browser){c.browser[O.browser]=true;c.browser.version=O.version}if(c.browser.webkit)c.browser.safari=true;if(wa)c.inArray=function(a,b){return wa.call(b,a)};S=c(r);if(r.addEventListener)L=function(){r.removeEventListener("DOMContentLoaded", |
||||
L,false);c.ready()};else if(r.attachEvent)L=function(){if(r.readyState==="complete"){r.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=r.documentElement,b=r.createElement("script"),d=r.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support= |
||||
{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null}; |
||||
b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=r.createDocumentFragment();a.appendChild(d.firstChild); |
||||
c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=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(),Ua=0,xa={},Va={};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==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true, |
||||
{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa: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{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}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===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&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===v)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 ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/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(o){var m= |
||||
c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,n=b.length;j<n;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=c(this);m.removeClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string"||a===v)for(var b=(a||"").split(ca), |
||||
d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(ya," "),j=0,n=b.length;j<n;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),n=b,o= |
||||
a.split(ca);e=o[i++];){n=f?n:!j.hasClass(e);j[n?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(ya," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===v){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 i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(za.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Wa,"")}return v}var n=c.isFunction(a);return this.each(function(o){var m=c(this),s=a;if(this.nodeType===1){if(n)s=a.call(this,o,m.val()); |
||||
if(typeof s==="number")s+="";if(c.isArray(s)&&za.test(this.type))this.checked=c.inArray(m.val(),s)>=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});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 v;if(f&&b in c.attrFn)return c(a)[b](d); |
||||
f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.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:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;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&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=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!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j= |
||||
function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a, |
||||
d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+ |
||||
s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a, |
||||
"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.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 v;a.result=v;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(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b, |
||||
d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), |
||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| |
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b= |
||||
0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true}; |
||||
c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b= |
||||
a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!== |
||||
"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this, |
||||
"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"|| |
||||
d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.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 ea.call(this,a)},beforeactivate:function(a){a= |
||||
a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.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 i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a, |
||||
b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+ |
||||
a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e){var i,j=0;if(c.isFunction(f)){e=f;f=v}for(d=(d||"").split(/\s+/);(i=d[j++])!=null;){i=i==="focus"?"focusin":i==="blur"?"focusout":i==="hover"?d.push("mouseleave")&&"mouseenter":i;b==="live"?c(this.context).bind(oa(i,this.selector),{data:f,selector:this.selector, |
||||
live:i},e):c(this.context).unbind(oa(i,this.selector),e?{guid:e.guid+this.selector+i}:null)}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});z.attachEvent&&!z.addEventListener&&z.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); |
||||
(function(){function a(g){for(var h="",k,l=0;g[l];l++){k=g[l];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===k){y=l[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=k;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}l[q]=y}}}function d(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache=== |
||||
k){y=l[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=k;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(o.filter(h,[t]).length>0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g|| |
||||
typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u= |
||||
l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.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])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&& |
||||
y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};o.matches=function(g,h){return o(g,null,null,h)};o.find=function(g,h,k){var l,q;if(!g)return[];for(var p=0,u=m.order.length;p<u;p++){var t=m.order[p];if(q=m.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");l=m.find[t](q, |
||||
h,k);if(l!=null){g=g.replace(m.match[t],"");break}}}}l||(l=h.getElementsByTagName("*"));return{set:l,expr:g}};o.filter=function(g,h,k,l){for(var q=g,p=[],u=h,t,y,R=h&&h[0]&&w(h[0]);g&&h.length;){for(var H in m.filter)if((t=m.leftMatch[H].exec(g))!=null&&t[2]){var M=m.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(u===p)p=[];if(m.preFilter[H])if(t=m.preFilter[H](t,u,k,p,l,R)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=u[U])!=null;U++)if(D){I=M(D,t,U,u);var Da= |
||||
l^!!I;if(k&&I!=null)if(Da)y=true;else u[U]=false;else if(Da){p.push(D);y=true}}if(I!==v){k||(u=p);g=g.replace(m.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)o.error(g);else break;q=g}return u};o.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var m=o.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, |
||||
TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,h){var k=typeof h==="string",l=k&&!/\W/.test(h);k=k&&!l;if(l)h=h.toLowerCase();l=0;for(var q=g.length, |
||||
p;l<q;l++)if(p=g[l]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[l]=k||p&&p.nodeName.toLowerCase()===h?p||false:p===h}k&&o.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l<q;l++){var p=g[l];if(p){k=p.parentNode;g[l]=k.nodeName.toLowerCase()===h?k:false}}}else{l=0;for(q=g.length;l<q;l++)if(p=g[l])g[l]=k?p.parentNode:p.parentNode===h;k&&o.filter(h,g,true)}},"":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p= |
||||
h=h.toLowerCase();q=b}q("parentNode",h,l,g,p,k)},"~":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,l,g,p,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];h=h.getElementsByName(g[1]);for(var l=0,q=h.length;l<q;l++)h[l].getAttribute("name")===g[1]&&k.push(h[l]);return k.length===0?null:k}}, |
||||
TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,l,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var u;(u=h[p])!=null;p++)if(u)if(q^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||l.push(u);else if(k)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,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.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,k){return!!o(k[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,k,l){return h===l.length-1},even:function(g,h){return h%2=== |
||||
0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k<l;k++)if(h[k]===g)return false;return true}else o.error("Syntax error, unrecognized expression: "+ |
||||
q)},CHILD:function(g,h){var k=h[1],l=g;switch(k){case "only":case "first":for(;l=l.previousSibling;)if(l.nodeType===1)return false;if(k==="first")return true;l=g;case "last":for(;l=l.nextSibling;)if(l.nodeType===1)return false;return true;case "nth":k=h[2];var q=h[3];if(k===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var u=0;for(l=p.firstChild;l;l=l.nextSibling)if(l.nodeType===1)l.nodeIndex=++u;p.sizcache=h}g=g.nodeIndex-q;return k===0?g===0:g%k===0&&g/k>= |
||||
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 k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="? |
||||
k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=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(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k<l;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var C;if(r.documentElement.compareDocumentPosition)C=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g=== |
||||
h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in r.documentElement)C=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(r.createRange)C=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),l=h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);l.setStart(h,0);l.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END, |
||||
l);if(g===0)j=true;return g};(function(){var g=r.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id"); |
||||
return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href", |
||||
2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== |
||||
0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[], |
||||
l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)o(g,h[q],k);return o.filter(l,k)};c.find=o;c.expr=o.selectors;c.expr[":"]=c.expr.filters;c.unique=o.uniqueSort;c.getText=a;c.isXMLDoc=w;c.contains=E})();var bb=/Until$/,cb=/^(?:parents|prevUntil|prevAll)/,db=/,/;Q=Array.prototype.slice;var Ea=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a, |
||||
function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Qa.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d= |
||||
0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ea(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ea(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e<n;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)> |
||||
-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.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(pa(a[0])||pa(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);bb.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||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.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===v||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 Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,sa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ia=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"], |
||||
col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_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<div>","</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!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(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}},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(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(Ha.exec(a)|| |
||||
["",""])[1].toLowerCase()]){a=a.replace(Ga,Ia);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this, |
||||
b,f))});else a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(s){return c.nodeName(s,"table")?s.getElementsByTagName("tbody")[0]||s.appendChild(s.ownerDocument.createElement("tbody")):s}var e,i,j=a[0],n=[];if(!c.support.checkClone&&arguments.length===3&&typeof j=== |
||||
"string"&&sa.test(j))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(j))return this.each(function(s){var x=c(this);a[0]=j.call(this,s,b?x.html():v);x.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ra(a,this,n);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var o=0,m=this.length;o<m;o++)d.call(b?f(this[o],i):this[o],e.cacheable||this.length>1||o>0?e.fragment.cloneNode(true):e.fragment)}n&&c.each(n, |
||||
Ma)}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);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){c.cleanData(this.getElementsByTagName("*"));c.cleanData([this])}this.parentNode&& |
||||
this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&c.cleanData(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||r;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||r;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j=== |
||||
"string"){j=j.replace(Ga,Ia);var n=(Ha.exec(j)||["",""])[1].toLowerCase(),o=F[n]||F._default,m=o[0];i=b.createElement("div");for(i.innerHTML=o[1]+j+o[2];m--;)i=i.lastChild;if(!c.support.tbody){m=fb.test(j);n=n==="table"&&!m?i.firstChild&&i.firstChild.childNodes:o[1]==="<table>"&&!m?i.childNodes:[];for(o=n.length-1;o>=0;--o)c.nodeName(n[o],"tbody")&&!n[o].childNodes.length&&n[o].parentNode.removeChild(n[o])}!c.support.leadingWhitespace&&V.test(j)&&i.insertBefore(b.createTextNode(V.exec(j)[0]),i.firstChild); |
||||
j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()==="text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e},cleanData:function(a){for(var b=0,d;(d=a[b])!=null;b++){c.event.remove(d);c.removeData(d)}}});var hb=/z-?index|font-?weight|opacity|zoom|line-?height/i, |
||||
Ja=/alpha\([^)]*\)/,Ka=/opacity=([^)]*)/,ga=/float/i,ha=/-([a-z])/ig,ib=/([A-Z])/g,jb=/^-?\d+(?:px)?$/i,kb=/^-?\d/,lb={position:"absolute",visibility:"hidden",display:"block"},mb=["Left","Right"],nb=["Top","Bottom"],ob=r.defaultView&&r.defaultView.getComputedStyle,La=c.support.cssFloat?"cssFloat":"styleFloat",ia=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===v)return c.curCSS(d,f);if(typeof e==="number"&&!hb.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 v;if((b==="width"||b==="height")&&parseFloat(d)<0)d=v;var f=a.style||a,e=d!==v;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=Ja.test(a)?a.replace(Ja,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ka.exec(f.filter)[1])/100+"":""}if(ga.test(b))b=La;b=b.replace(ha,ia);if(e)f[b]=d;return f[b]},css:function(a, |
||||
b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?mb:nb;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,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?j():c.swap(a,lb,j);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=Ka.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ga.test(b))b=La;if(!d&&e&&e[b])f=e[b];else if(ob){if(ga.test(b))b="float";b=b.replace(ib,"-$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(ha,ia);f=a.currentStyle[b]||a.currentStyle[d];if(!jb.test(f)&&kb.test(f)){b=e.left;var i=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=i}}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 pb= |
||||
J(),qb=/<script(.|\s)*?\/script>/gi,rb=/select|textarea/i,sb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ja=/\?/,tb=/(\?|&)_=.*?(&|$)/,ub=/^(\w+:)?\/\/([^\/?#]+)/,vb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(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 i=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(j,n){if(n==="success"||n==="notmodified")i.html(e?c("<div />").append(j.responseText.replace(qb,"")).find(e):j.responseText);d&&i.each(d,[j.responseText,n,j])}});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||rb.test(this.nodeName)||sb.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:z.XMLHttpRequest&&(z.location.protocol!=="file:"||!z.ActiveXObject)?function(){return new z.XMLHttpRequest}: |
||||
function(){try{return new z.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(o,n,j,w);e.global&&f("ajaxSuccess",[w,e])}function d(){e.complete&&e.complete.call(o,w,j);e.global&&f("ajaxComplete",[w,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),i,j,n,o=a&&a.context||e,m=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(m==="GET")N.test(e.url)||(e.url+=(ja.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))){i=e.jsonpCallback||"jsonp"+pb++;if(e.data)e.data=(e.data+"").replace(N,"="+i+"$1");e.url=e.url.replace(N,"="+i+"$1");e.dataType="script";z[i]=z[i]||function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&&A.removeChild(B)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&m==="GET"){var s=J(),x=e.url.replace(tb,"$1_="+s+"$2");e.url=x+(x===e.url?(ja.test(e.url)?"&":"?")+"_="+s:"")}if(e.data&&m==="GET")e.url+=(ja.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&& |
||||
c.event.trigger("ajaxStart");s=(s=ub.exec(e.url))&&(s[1]&&s[1]!==location.protocol||s[2]!==location.host);if(e.dataType==="script"&&m==="GET"&&s){var A=r.getElementsByTagName("head")[0]||r.documentElement,B=r.createElement("script");B.src=e.url;if(e.scriptCharset)B.charset=e.scriptCharset;if(!i){var C=false;B.onload=B.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;b();d();B.onload=B.onreadystatechange=null;A&&B.parentNode&& |
||||
A.removeChild(B)}}}A.insertBefore(B,A.firstChild);return v}var E=false,w=e.xhr();if(w){e.username?w.open(m,e.url,e.async,e.username,e.password):w.open(m,e.url,e.async);try{if(e.data||a&&a.contentType)w.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&w.setRequestHeader("If-None-Match",c.etag[e.url])}s||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept", |
||||
e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(fa){}if(e.beforeSend&&e.beforeSend.call(o,w,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");w.abort();return false}e.global&&f("ajaxSend",[w,e]);var g=w.onreadystatechange=function(q){if(!w||w.readyState===0||q==="abort"){E||d();E=true;if(w)w.onreadystatechange=c.noop}else if(!E&&w&&(w.readyState===4||q==="timeout")){E=true;w.onreadystatechange=c.noop;j=q==="timeout"?"timeout":!c.httpSuccess(w)? |
||||
"error":e.ifModified&&c.httpNotModified(w,e.url)?"notmodified":"success";var p;if(j==="success")try{n=c.httpData(w,e.dataType,e)}catch(u){j="parsererror";p=u}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,w,j,p);d();q==="timeout"&&w.abort();if(e.async)w=null}};try{var h=w.abort;w.abort=function(){w&&h.call(w);g("abort")}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){w&&!E&&g("timeout")},e.timeout);try{w.send(m==="POST"||m==="PUT"||m==="DELETE"?e.data:null)}catch(l){c.handleError(e, |
||||
w,null,l);d()}e.async||g();return w}},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(j,n){if(c.isArray(n))c.each(n, |
||||
function(o,m){b?f(j,m):d(j+"["+(typeof m==="object"||c.isArray(m)?o:"")+"]",m)});else!b&&n!=null&&typeof n==="object"?c.each(n,function(o,m){d(j+"["+o+"]",m)}):f(j,n)}function f(j,n){n=c.isFunction(n)?n():n;e[e.length]=encodeURIComponent(j)+"="+encodeURIComponent(n)}var e=[];if(b===v)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var i in a)d(i,a[i]);return e.join("&").replace(vb,"+")}});var ka={},wb=/toggle|show|hide/,xb=/^([+-]=)?([\d+-.]+)(.*)$/, |
||||
W,ta=[["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<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(ka[d])f=ka[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove(); |
||||
ka[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&& |
||||
c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,n=this.nodeType===1&&c(this).is(":hidden"), |
||||
o=this;for(j in a){var m=j.replace(ha,ia);if(j!==m){a[m]=a[j];delete a[j];j=m}if(a[j]==="hide"&&n||a[j]==="show"&&!n)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(s,x){var A=new c.fx(o,i,s);if(wb.test(x))A[x==="toggle"?n?"show":"hide":x](a); |
||||
else{var B=xb.exec(x),C=A.cur(true)||0;if(B){x=parseFloat(B[2]);var E=B[3]||"px";if(E!=="px"){o.style[s]=(x||1)+E;C=(x||1)/A.cur(true)*C;o.style[s]=C+E}if(B[1])x=(B[1]==="-="?-1:1)*x+C;A.custom(C,x,E)}else A.custom(C,x,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=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(i){return e.step(i)}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.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!= |
||||
null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in r.documentElement?function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(), |
||||
f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f= |
||||
b,e=b.ownerDocument,i,j=e.documentElement,n=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var o=b.offsetTop,m=b.offsetLeft;(b=b.parentNode)&&b!==n&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;o-=b.scrollTop;m-=b.scrollLeft;if(b===d){o+=b.offsetTop;m+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){o+=parseFloat(i.borderTopWidth)|| |
||||
0;m+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){o+=parseFloat(i.borderTopWidth)||0;m+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){o+=n.offsetTop;m+=n.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){o+=Math.max(j.scrollTop,n.scrollTop);m+=Math.max(j.scrollLeft,n.scrollLeft)}return{top:o,left:m}};c.offset={initialize:function(){var a=r.body,b=r.createElement("div"), |
||||
d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";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!==i;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(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left- |
||||
e.left+j};"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||r.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],i;if(!e)return null;if(f!==v)return this.each(function(){if(i=ua(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=ua(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.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(i){var j=c(this);j[d](f.call(this,i,j[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===v?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});z.jQuery=z.$=c})(window); |
||||
Binary file not shown.
@ -0,0 +1,28 @@ |
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> |
||||
<head> |
||||
<title>SWFObject 2 static publishing example page</title> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> |
||||
<script type="text/javascript" src="swfobject.js"></script> |
||||
<script type="text/javascript"> |
||||
swfobject.registerObject("myId", "9.0.0", "expressInstall.swf"); |
||||
</script> |
||||
</head> |
||||
<body> |
||||
<div> |
||||
<object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120"> |
||||
<param name="movie" value="test.swf" /> |
||||
<!--[if !IE]>--> |
||||
<object type="application/x-shockwave-flash" data="test.swf" width="300" height="120"> |
||||
<!--<![endif]--> |
||||
<div> |
||||
<h1>Alternative content</h1> |
||||
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p> |
||||
</div> |
||||
<!--[if !IE]>--> |
||||
</object> |
||||
<!--<![endif]--> |
||||
</object> |
||||
</div> |
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,17 @@ |
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> |
||||
<head> |
||||
<title>SWFObject 2 dynamic publishing example page</title> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> |
||||
<script type="text/javascript" src="swfobject.js"></script> |
||||
<script type="text/javascript"> |
||||
swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf"); |
||||
</script> |
||||
</head> |
||||
<body> |
||||
<div id="myContent"> |
||||
<h1>Alternative content</h1> |
||||
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p> |
||||
</div> |
||||
</body> |
||||
</html> |
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@ -0,0 +1,80 @@ |
||||
{% extends "admin/change_list.html" %} |
||||
{% load i18n %} |
||||
|
||||
{% block extrahead %} |
||||
{{ block.super }} |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/jquery.js"></script> |
||||
<script type="text/javascript"> |
||||
$(document).ready(function() { |
||||
$('#custom-tools').hide(); |
||||
|
||||
function toggle_main_actions() { |
||||
$('#main-tools').slideToggle('medium'); |
||||
}; |
||||
|
||||
$('#deploy-actions').click(function() { |
||||
$('#custom-tools').slideToggle('medium', function () { |
||||
toggle_main_actions(); |
||||
}); |
||||
}); |
||||
|
||||
$('#unploy-actions').click(function() { |
||||
$('#custom-tools').slideToggle('medium', function () { |
||||
toggle_main_actions(); |
||||
}); |
||||
}); |
||||
|
||||
}); |
||||
</script> |
||||
{% endblock %} |
||||
|
||||
{% block object-tools %} |
||||
<ul class="object-tools" id="main-tools" style="position: bottom;"> |
||||
{% if has_add_permission %} |
||||
<li> |
||||
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> |
||||
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} |
||||
</a> |
||||
</li> |
||||
{% endif %} |
||||
<li> |
||||
<a href="#" class="addlink" id="deploy-actions"> |
||||
{% trans 'Actions' %} |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
|
||||
<ul class="object-tools" id="custom-tools"> |
||||
{% if has_add_permission %} |
||||
<li> |
||||
<a href="import/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> |
||||
{% blocktrans with cl.opts.verbose_name as name %}Import {{ name }}s{% endblocktrans %} |
||||
</a> |
||||
</li> |
||||
{% endif %} |
||||
{% if perms.newsletter.add_mailinglist %} |
||||
<li> |
||||
<a href="create_mailinglist/{{ cl.get_query_string }}" class="viewsitelink"> |
||||
{% trans 'Add to a mailing list' %} |
||||
</a> |
||||
</li> |
||||
{% endif %} |
||||
{% if user.is_superuser %} |
||||
<li> |
||||
<a href="export_vcard/{{ cl.get_query_string }}" class="viewsitelink"> |
||||
{% blocktrans with cl.opts.verbose_name as name %}Export {{ name }} as VCard{% endblocktrans %} |
||||
</a> |
||||
</li> |
||||
<li> |
||||
<a href="export_excel/{{ cl.get_query_string }}" class="viewsitelink"> |
||||
{% blocktrans with cl.opts.verbose_name as name %}Export {{ name }} as Excel{% endblocktrans %} |
||||
</a> |
||||
</li> |
||||
{% endif %} |
||||
<li> |
||||
<a href="#" id="unploy-actions"> |
||||
X |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
{% endblock %} |
||||
@ -0,0 +1,15 @@ |
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
||||
<html xml:lang="{{ LANGUAGE_CODE }}" lang="{{ LANGUAGE_CODE }}" version="-//W3C//DTD XHTML 1.1//EN" xmlns="http://www.w3.org/1999/xhtml"> |
||||
<head> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
||||
<meta name="language" content="{{ LANGUAGE_CODE }}" /> |
||||
<meta name="description" content="{% block meta-description %}Emencia Django Newsletter for sending newsletter.{% endblock %}" /> |
||||
<meta name="author" content="Fantomas42" /> |
||||
<title>Emencia Django Newsletter - {% block title %}{% endblock %}</title> |
||||
</head> |
||||
<body> |
||||
<h1>Emencia Django Newsletter</h1> |
||||
{% block content %} |
||||
{% endblock %} |
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,23 @@ |
||||
{% load i18n %} |
||||
|
||||
{% if object.title %} |
||||
<h2>{{ object.title }}</h2> |
||||
{% endif %} |
||||
{% if form.saved %} |
||||
<p> |
||||
{% trans "You have successfully subscribed to the mailing list!" %} |
||||
</p> |
||||
{% else %} |
||||
{% if object.show_description and object.mailing_list.description %} |
||||
<p class="mailingListDescription"> |
||||
{{ object.mailing_list.description }} |
||||
</p> |
||||
{% endif %} |
||||
<form action="{{ request.path }}" method="post" id="NewsletterForm"> |
||||
{% csrf_token %} |
||||
{{ form.as_p }} |
||||
<input type="hidden" name="{{ form_name }}" value="1" /> |
||||
<input type="submit" name="submit" value="{% trans 'Subscribe' %}" /> |
||||
</form> |
||||
{% endif %} |
||||
|
||||
@ -0,0 +1,109 @@ |
||||
{% extends "admin/base_site.html" %} |
||||
{% load i18n adminmedia %} |
||||
|
||||
{% block breadcrumbs %} |
||||
{% if not is_popup %} |
||||
<div class="breadcrumbs"> |
||||
<a href="../../../">{% trans "Home" %}</a> › |
||||
<a href="../../">{{ app_label|capfirst|escape }}</a> › |
||||
<a href="../">{{ opts.verbose_name_plural|capfirst }}</a> › |
||||
{% trans 'Importation' %} |
||||
</div> |
||||
{% endif %} |
||||
{% endblock %} |
||||
|
||||
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %} |
||||
|
||||
{% block content %} |
||||
<div id="content-main"> |
||||
|
||||
<form action="." method="post" enctype="multipart/form-data"> |
||||
{% csrf_token %} |
||||
<div> |
||||
<fieldset class="module aligned"> |
||||
<h2>{% trans "Excel" %}</h2> |
||||
<div class="form-row source"> |
||||
<div> |
||||
<label for="id_source" class="required">{% trans "Excel file (.xls)" %} :</label> |
||||
<input name="type" value="excel" type="hidden" /> |
||||
<input name="source" id="id_source" type="file" class="vTextField" /> |
||||
</div> |
||||
<p class="help">{% trans "Import contacts from a Excel file." %}<br /> |
||||
{% trans "Columns are [email][last name][first name][tags]." %}<br /> |
||||
{% trans "All columns are optionnal excepting the email." %} |
||||
</p> |
||||
</div> |
||||
</fieldset> |
||||
<div class="submit-row"> |
||||
<input type="submit" class="default" value="{% trans "Import" %}" /> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
|
||||
<form action="." method="post" enctype="multipart/form-data"> |
||||
{% csrf_token %} |
||||
<div> |
||||
<fieldset class="module aligned"> |
||||
<h2>{% trans "Text" %}</h2> |
||||
<div class="form-row source"> |
||||
<div> |
||||
<label for="id_source" class="required">{% trans "Text file (.txt, .csv)" %} :</label> |
||||
<input name="type" value="text" type="hidden" /> |
||||
<input name="source" id="id_source" type="file" class="vTextField" /> |
||||
</div> |
||||
<p class="help">{% trans "Import contacts from a text file, or a CSV file." %}<br /> |
||||
{% trans "Columns are [email][last name][first name][tags], splitted by a dot coma." %}<br /> |
||||
{% trans "All columns are optionnal excepting the email." %} |
||||
</p> |
||||
</div> |
||||
</fieldset> |
||||
<div class="submit-row"> |
||||
<input type="submit" class="default" value="{% trans "Import" %}" /> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
|
||||
<form action="." method="post" enctype="multipart/form-data"> |
||||
{% csrf_token %} |
||||
<div> |
||||
<fieldset class="module aligned"> |
||||
<h2>{% trans "VCard" %}</h2> |
||||
<div class="form-row source"> |
||||
<div> |
||||
<label for="id_source" class="required">{% trans "VCard file (.cvf)" %} :</label> |
||||
<input name="type" value="vcard" type="hidden" /> |
||||
<input name="source" id="id_source" type="file" class="vTextField" /> |
||||
</div> |
||||
<p class="help">{% trans "Import contacts from your favorite mail client, by providing a VCard file." %}</p> |
||||
</div> |
||||
</fieldset> |
||||
<div class="submit-row"> |
||||
<input type="submit" class="default" value="{% trans "Import" %}" /> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
|
||||
<form action="." method="post"> |
||||
{% csrf_token %} |
||||
<div> |
||||
<fieldset class="module aligned"> |
||||
<h2>{% trans "Raw text" %}</h2> |
||||
<div class="form-row source"> |
||||
<div> |
||||
<label for="id_source" class="required">{% trans "Raw text" %} :</label> |
||||
<input name="type" value="text" type="hidden" /> |
||||
<textarea name="source" id="id_source" class="vLargeTextField" cols="40" rows="15" /></textarea> |
||||
</div> |
||||
<p class="help">{% trans "Columns are [email][last name][first name][tags], splitted by a dot coma." %}<br /> |
||||
{% trans "All columns are optionnal excepting the email." %} |
||||
</p> |
||||
</div> |
||||
</fieldset> |
||||
<div class="submit-row"> |
||||
<input type="submit" class="default" value="{% trans "Import" %}" /> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
|
||||
</div> |
||||
{% endblock %} |
||||
@ -0,0 +1,25 @@ |
||||
{% extends "newsletter/base.html"%} |
||||
{% load i18n %} |
||||
|
||||
{% block title %}{% trans "Subscription to mailing list" %}{% endblock %} |
||||
|
||||
{% block content %} |
||||
<h2>{% trans "Subscription to mailing list" %}</h2> |
||||
|
||||
{% if subscribed %} |
||||
<p>{% trans "Thanks for your subscription!" %}</p> |
||||
{% else %} |
||||
{% if mailing_list %} |
||||
<h3>{{ mailing_list }}</h3> |
||||
{{ mailing_list|linebreaks }} |
||||
{% else %} |
||||
<p>{% trans "Validate this form to subscribe to the mailing lists." %}</p> |
||||
{% endif %} |
||||
<form action="." method="post"> |
||||
{% csrf_token %} |
||||
{{ form.as_p }} |
||||
<input type="submit" value="{% trans "Subscribe" %}" /> |
||||
</form> |
||||
{% endif %} |
||||
|
||||
{% endblock %} |
||||
@ -0,0 +1,32 @@ |
||||
{% extends 'client/blank.html' %} |
||||
|
||||
{% block title %}Отписаться{% endblock %} |
||||
|
||||
{% block content %} |
||||
<div class="contactmore"> |
||||
<div class="row"> |
||||
{% if already_unsubscribed %} |
||||
<div class="small-12 large-8 medium-8 columns"> |
||||
<h2>Вы уже отписаны отэтой рассылки</h2> |
||||
</div> |
||||
{% else %} |
||||
<div class="small-12 large-8 medium-8 columns"> |
||||
<h2>Отписаться</h2> |
||||
<div class="section-title-bottom-line"></div> |
||||
<div id="sendstatus"></div> |
||||
<div id="contactform"> |
||||
<form action="." method="post">{% csrf_token %} |
||||
|
||||
<p><label for="name">Email:*</label> <input type="text" value="{{ email }}" name="email" readonly /></p> |
||||
|
||||
<p><input type="submit" class="button radius medium" name="submit" id="submit" value="Отписаться" tabindex="4" /></p> |
||||
|
||||
</form> |
||||
</div> |
||||
</div> |
||||
{% endif %} |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
{% endblock %} |
||||
@ -0,0 +1,45 @@ |
||||
<html> |
||||
<head> |
||||
<style type="text/css"> |
||||
.link_layout{ filter : alpha(opacity=70); -moz-opacity : 0.7; opacity : 0.7; border: 1px solid red;} |
||||
</style> |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/jquery.js"></script> |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/jquery.heatcolor.js"></script> |
||||
<script type="text/javascript"> |
||||
var top_links = [{% for tl in top_links %}"{{ tl.link.url|safe }}",{% endfor %}]; |
||||
var top_links_score = new Array(); |
||||
{% for tl in top_links %} |
||||
top_links_score["{{ tl.link.url|safe }}"] = "{{ tl.total_clicks }}"; |
||||
{% endfor %} |
||||
|
||||
function create_overlay(top, left, width, height, score) { |
||||
$("<div>", {"style": "position: absolute; width: "+ width +"px; height: "+ height +"px; top:" + top + "px; left:" + left + "px;", |
||||
"text": score, |
||||
"class": "link_layout"}).appendTo("#density_overlay"); |
||||
} |
||||
|
||||
$(document).ready(function(){ |
||||
$("a").each(function(a){ |
||||
var link = $(this); |
||||
var href = link.attr("href"); |
||||
|
||||
if (jQuery.inArray(href, top_links) != -1) { |
||||
var position = link.position(); |
||||
create_overlay(position.top - 3, position.left - 3, link.width() + 4, link.height() + 4, |
||||
top_links_score[href]); |
||||
} |
||||
}); |
||||
$("div.link_layout").heatcolor( |
||||
function() { return $(this).text(); }, |
||||
{lightness: 0, colorStyle: 'greentored', reverseOrder: true }); |
||||
}); |
||||
</script> |
||||
<title>{% block title %}{{ object.title }}{% endblock %}</title> |
||||
</head> |
||||
<body> |
||||
<div id="density_overlay"></div> |
||||
{% block body %} |
||||
{{ object.content|safe }} |
||||
{% endblock %} |
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,8 @@ |
||||
<html> |
||||
<head> |
||||
<title>{% block title %}{{ title }}{% endblock %}</title> |
||||
</head> |
||||
{% block body %} |
||||
{{ content|safe }} |
||||
{% endblock %} |
||||
</html> |
||||
@ -0,0 +1,40 @@ |
||||
{% extends "admin/change_list.html" %} |
||||
{% load i18n %} |
||||
|
||||
{% block bodyclass %}change-list historic{% endblock %} |
||||
|
||||
{% block breadcrumbs %} |
||||
{% if not is_popup %} |
||||
<div class="breadcrumbs"> |
||||
<a href="{% url 'admin:index' %}">{% trans "Admin." %}</a> › |
||||
<a href="{% url 'admin:app_list' 'newsletter' %}">{{ app_label|capfirst|escape }}</a> › |
||||
<a href="{% url 'admin:newsletter_newsletter_changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> › |
||||
{{ title }} |
||||
</div> |
||||
{% endif %} |
||||
{% endblock %} |
||||
|
||||
{% block content %} |
||||
<div id="content-main"> |
||||
<div class="module" id="changelist"> |
||||
<table cellspacing="0"> |
||||
<thead> |
||||
<tr> |
||||
<th>{% trans "Date" %}</th> |
||||
<th>{% trans "Contact" %}</th> |
||||
<th>{% trans "Action" %}</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for event in original.contactmailingstatus_set.all %} |
||||
<tr class="{% cycle row1,row2 %}"> |
||||
<td class="nowrap">{{ event.creation_date|date:"d F Y, H:i" }}</td> |
||||
<td>{{ event.contact.mail_format }}</td> |
||||
<td>{{ event.get_status_display }} {% if event.link %}{{ event.link.url|urlize }}{% endif %}</td> |
||||
</tr> |
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
{% endblock %} |
||||
@ -0,0 +1 @@ |
||||
<img src="http://{{ domain }}{% url 'newsletter_newsletter_tracking' slug=newsletter.slug uidb36=uidb36 token=token format=tracking_image_format %}" width="1" height="1" /> |
||||
@ -0,0 +1,8 @@ |
||||
{% load i18n %} |
||||
<div id="links"> |
||||
<a name="links"></a> |
||||
<p> |
||||
{% trans "If you cannot see this email," %} |
||||
<a href="http://{{ domain }}{% url 'newsletter_newsletter_contact' slug=newsletter.slug uidb36=uidb36 token=token %}">{% trans "click here" %}</a>. |
||||
</p> |
||||
</div> |
||||
@ -0,0 +1,8 @@ |
||||
{% load i18n %} |
||||
<div id="unsubscription"> |
||||
<a name="unsubscription"></a> |
||||
<p> |
||||
{% trans "For unsubscribing to this mailing list," %} |
||||
<a href="{% if uidb36 and token %}http://{{ domain }}{% url 'newsletter_mailinglist_unsubscribe' slug=newsletter.slug uidb36=uidb36 token=token %}{% else %}#{% endif %}">{% trans "click here" %}</a>. |
||||
</p> |
||||
</div> |
||||
@ -0,0 +1,213 @@ |
||||
{% extends "admin/base_site.html" %} |
||||
{% load i18n %} |
||||
|
||||
{% block coltype %}colMS{% endblock %} |
||||
|
||||
{% block bodyclass %}dashboard{% endblock %} |
||||
|
||||
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css" />{% endblock %} |
||||
|
||||
{% block extrahead %} |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/jquery.js"></script> |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/jquery.form.js"></script> |
||||
<script type="text/javascript" src="{{ STATIC_URL }}edn/js/swfobject/swfobject.js"></script> |
||||
<script type="text/javascript"> |
||||
OFC = {}; |
||||
|
||||
OFC.jquery = { |
||||
name: "jQuery", |
||||
version: function(src) { return $('#'+ src)[0].get_version() }, |
||||
rasterize: function (src, dst) { $('#'+ dst).replaceWith(OFC.jquery.image(src)) }, |
||||
image: function(src) { return "<img src='data:image/png;base64," + $('#'+src)[0].get_img_binary() + "' />"}, |
||||
popup: function(src) { |
||||
var img_win = window.open('', 'Charts: Export as Image') |
||||
with(img_win.document) { |
||||
write('<html><head><title>Charts: Export as Image<\/title><\/head><bo' + 'dy>' + OFC.jquery.image(src) + '<\/body><\/html>') } |
||||
// stop the 'loading...' message |
||||
img_win.document.close(); |
||||
} |
||||
} |
||||
|
||||
if (typeof(Control == "undefined")) {var Control = {OFC: OFC.jquery}} |
||||
|
||||
function save_image() { OFC.jquery.popup('charts_view'); } |
||||
|
||||
$(document).ready(function(){ |
||||
swfobject.embedSWF("{{ STATIC_URL }}edn/swf/open-flash-chart.swf", "charts_view", "498", "350", "9.0.0", |
||||
"{{ STATIC_URL }}edn/js/swfobject/expressInstall.swf", |
||||
{"data-file": "{% url 'newsletter_newsletter_charts' object.slug %}"}); |
||||
|
||||
function reload_charts(charts_data) { |
||||
swfobject.getObjectById("charts_view").load(charts_data); |
||||
}; |
||||
|
||||
function validate(formData, jqForm, options) { |
||||
for (var i=0; i < formData.length; i++) { |
||||
if (formData[i].name == 'start') { |
||||
var start = parseInt(formData[i].value); |
||||
} |
||||
if (formData[i].name == 'end') { |
||||
var end = parseInt(formData[i].value); |
||||
} |
||||
} |
||||
if (start > end) { |
||||
return false; |
||||
} |
||||
}; |
||||
|
||||
var options = {success: reload_charts, |
||||
beforeSubmit: validate}; |
||||
$("#period_selector").ajaxForm(options); |
||||
}); |
||||
</script> |
||||
{% endblock %} |
||||
|
||||
{% block breadcrumbs %} |
||||
{% if not is_popup %} |
||||
<div class="breadcrumbs"> |
||||
<a href="{% url 'admin:index' %}">{% trans "Admin." %}</a> › |
||||
<a href="{% url 'admin:app_list' 'newsletter' %}">{{ app_label|capfirst|escape }}</a> › |
||||
<a href="{% url 'admin:newsletter_newsletter_changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> › |
||||
{{ title }} |
||||
</div> |
||||
{% endif %} |
||||
{% endblock %} |
||||
|
||||
{% block content %} |
||||
<div id="content-main"> |
||||
{% if period %} |
||||
<!-- Graph --> |
||||
<div class="module" id="charts"> |
||||
<div id="charts_view"></div> |
||||
</div> |
||||
<div class="module" id="charts_options"> |
||||
<form id="period_selector" action="{% url 'newsletter_newsletter_charts' object.slug %}" method="post"> |
||||
{% csrf_token %} |
||||
<table summary="{% trans "Consultation histogram" %}"> |
||||
<tr> |
||||
<th scope="row" style="vertical-align: middle;"> |
||||
{% trans "Period" %} : |
||||
</th> |
||||
<td> |
||||
<select name="start"> |
||||
{% for date in period %} |
||||
<option value="{{ forloop.counter0 }}" {% ifequal forloop.counter0 0 %}selected="selected"{% endifequal %}>{{ date|date:"d M Y" }}</option> |
||||
{% endfor %} |
||||
</select> |
||||
<span>-></span> |
||||
<select name="end"> |
||||
{% for date in period %} |
||||
<option value="{{ forloop.counter0 }}" {% ifequal forloop.counter0 6 %}selected="selected"{% endifequal %}>{{ date|date:"d M Y" }}</option> |
||||
{% endfor %} |
||||
</select> |
||||
</td> |
||||
<td><input type="submit" value="OK" /></td> |
||||
</tr> |
||||
</table> |
||||
</form> |
||||
</div> |
||||
{% endif %} |
||||
<!-- Receptions --> |
||||
<div class="module" id="reception"> |
||||
<table summary="{% trans "Broadcasting statistics" %}"> |
||||
<caption><a href="#" class="section">{% trans "Broadcasting statistics" %}</a></caption> |
||||
<tr> |
||||
<th scope="row">{% trans "Total openings" %}</th> |
||||
<td> </td> |
||||
<td>{{ stats.total_openings }}</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Openings on site" %}</th> |
||||
<td>{{ stats.total_on_site_openings }}</td> |
||||
<td>{{ stats.unique_on_site_openings }}</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Total openings unique" %}</th> |
||||
<td>{{ stats.unique_openings }}</td> |
||||
<td>{{ stats.unique_openings_percent|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Unknow delivery" %}</th> |
||||
<td>{{ stats.unknow_openings }}</td> |
||||
<td>{{ stats.unknow_openings_percent|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Unsubscriptions" %}</th> |
||||
<td>{{ stats.total_unsubscriptions }}</td> |
||||
<td>{{ stats.total_unsubscriptions_percent|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Openings average" %}</th> |
||||
<td> </td> |
||||
<td>{{ stats.opening_average|floatformat:2 }}</td> |
||||
</tr> |
||||
</table> |
||||
</div> |
||||
<!-- Links --> |
||||
<div class="module" id="reception"> |
||||
<table summary="{% trans "Links statistics" %}"> |
||||
<caption><a href="#" class="section">{% trans "Links statistics" %}</a></caption> |
||||
<tr> |
||||
<th scope="row">{% trans "Total clicked links" %}</th> |
||||
<td>{{ stats.total_clicked_links }}</td> |
||||
<td>{{ stats.total_clicked_links_percent|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Total clicked links unique" %}</th> |
||||
<td>{{ stats.unique_clicked_links }}</td> |
||||
<td>{{ stats.unique_clicked_links_percent|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Clicked links by openings" %}</th> |
||||
<td> </td> |
||||
<td>{{ stats.clicked_links_by_openings|floatformat:2 }}%</td> |
||||
</tr> |
||||
<tr> |
||||
<th scope="row">{% trans "Clicked links average" %}</th> |
||||
<td> </td> |
||||
<td>{{ stats.clicked_links_average|floatformat:2 }}</td> |
||||
</tr> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
{% endblock %} |
||||
|
||||
{% block sidebar %} |
||||
<div id="content-related"> |
||||
<div class="module" id="report-module"> |
||||
<h2>{% trans "Report" %}</h2> |
||||
<h3> |
||||
<a href="{% url 'newsletter_newsletter_report' object.slug %}">{% trans "Download CSV report" %}</a> |
||||
</h3> |
||||
<p></p> |
||||
</div> |
||||
<div class="module" id="general-informations-module"> |
||||
<h2>{% trans "Informations" %}</h2> |
||||
<h3>{% trans "Recipients" %}</h3> |
||||
<p>{{ stats.mails_to_send }} <a href="{% url 'admin:newsletter_mailinglist_change' object.mailing_list.pk %}">{% trans "View" %}</a></p> |
||||
<h3>{% trans "Status" %}</h3> |
||||
<p>{{ object.get_status_display }} {% if stats.remaining_mails %}<span class="mini quiet">(-{{ stats.remaining_mails }})</span>{% endif %}</p> |
||||
<h3>{% trans "Sending date" %}</h3> |
||||
<p>{{ object.sending_date|date:"d M Y H:i" }}</p> |
||||
{% if stats.tests_sent %} |
||||
<h3>{% trans "Tests sent" %}</h3> |
||||
<p>{{ stats.tests_sent }}</p> |
||||
{% endif %} |
||||
</div> |
||||
<div class="module" id="top-links-module"> |
||||
<h2>{% trans "Top Links" %} |
||||
(<a href="{% url 'newsletter_newsletter_density' object.slug %}">{% trans "Density map" %}</a>) |
||||
</h2> |
||||
<ul class="actionlist"> |
||||
{% for top_link in stats.top_links %} |
||||
<li><a href="{{ top_link.link.url }}" title="{{ top_link.link.title }}" target="blank">{{ top_link.link.title|slice:":23" }}</a> |
||||
<span class="quiet">({{ top_link.total_clicks }})</span> |
||||
<span class="mini quiet">({{ top_link.unique_clicks }})</span> |
||||
</li> |
||||
{% empty %} |
||||
<li>{% trans "No Top Links yet." %}</li> |
||||
{% endfor %} |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
{% endblock %} |
||||
@ -0,0 +1,708 @@ |
||||
"""Unit tests for emencia.django.newsletter""" |
||||
from datetime import datetime |
||||
from datetime import timedelta |
||||
from tempfile import NamedTemporaryFile |
||||
|
||||
from django.test import TestCase |
||||
from django.http import Http404 |
||||
from django.db import IntegrityError |
||||
from django.core.files import File |
||||
|
||||
from emencia.django.newsletter.mailer import Mailer |
||||
from emencia.django.newsletter.models import Link |
||||
from emencia.django.newsletter.models import Contact |
||||
from emencia.django.newsletter.models import MailingList |
||||
from emencia.django.newsletter.models import SMTPServer |
||||
from emencia.django.newsletter.models import Newsletter |
||||
from emencia.django.newsletter.models import Attachment |
||||
from emencia.django.newsletter.models import ContactMailingStatus |
||||
from emencia.django.newsletter.utils.tokens import tokenize |
||||
from emencia.django.newsletter.utils.tokens import untokenize |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_opening_statistics |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_on_site_opening_statistics |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_unsubscription_statistics |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_clicked_link_statistics |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_top_links |
||||
from emencia.django.newsletter.utils.statistics import get_newsletter_statistics |
||||
|
||||
|
||||
class FakeSMTP(object): |
||||
mails_sent = 0 |
||||
|
||||
def sendmail(self, *ka, **kw): |
||||
self.mails_sent += 1 |
||||
return {} |
||||
|
||||
def quit(*ka, **kw): |
||||
pass |
||||
|
||||
|
||||
class SMTPServerTestCase(TestCase): |
||||
"""Tests for the SMTPServer model""" |
||||
|
||||
def setUp(self): |
||||
self.server = SMTPServer.objects.create(name='Test SMTP', |
||||
host='smtp.domain.com') |
||||
self.server_2 = SMTPServer.objects.create(name='Test SMTP 2', |
||||
host='smtp.domain2.com') |
||||
self.contact = Contact.objects.create(email='test@domain.com') |
||||
self.mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.mailinglist.subscribers.add(self.contact) |
||||
self.newsletter = Newsletter.objects.create(title='Test Newsletter', |
||||
content='Test Newsletter Content', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server, slug='test-nl') |
||||
|
||||
self.newsletter_2 = Newsletter.objects.create(title='Test Newsletter 2', |
||||
content='Test Newsletter 2 Content', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server, slug='test-nl-2') |
||||
self.newsletter_3 = Newsletter.objects.create(title='Test Newsletter 2', |
||||
content='Test Newsletter 2 Content', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server_2, slug='test-nl-3') |
||||
|
||||
def test_credits(self): |
||||
# Testing unlimited account |
||||
self.assertEquals(self.server.credits(), 10000) |
||||
# Testing default limit |
||||
self.server.mails_hour = 42 |
||||
self.assertEquals(self.server.credits(), 42) |
||||
|
||||
# Testing credits status, with multiple server case |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT) |
||||
self.assertEquals(self.server.credits(), 41) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT_TEST) |
||||
self.assertEquals(self.server.credits(), 40) |
||||
# Testing with a fake status |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.ERROR) |
||||
self.assertEquals(self.server.credits(), 40) |
||||
# Testing with a second newsletter sharing the server |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter_2, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT) |
||||
self.assertEquals(self.server.credits(), 39) |
||||
# Testing with a third newsletter with another server |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter_3, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT) |
||||
self.assertEquals(self.server.credits(), 39) |
||||
|
||||
def test_custom_headers(self): |
||||
self.assertEquals(self.server.custom_headers, {}) |
||||
self.server.headers = 'key_1: val_1\r\nkey_2 : val_2' |
||||
self.assertEquals(len(self.server.custom_headers), 2) |
||||
|
||||
|
||||
class ContactTestCase(TestCase): |
||||
"""Tests for the Contact model""" |
||||
|
||||
def setUp(self): |
||||
self.mailinglist_1 = MailingList.objects.create(name='Test MailingList') |
||||
self.mailinglist_2 = MailingList.objects.create(name='Test MailingList 2') |
||||
|
||||
def test_unique(self): |
||||
Contact(email='test@domain.com').save() |
||||
self.assertRaises(IntegrityError, Contact(email='test@domain.com').save) |
||||
|
||||
def test_mail_format(self): |
||||
contact = Contact(email='test@domain.com') |
||||
self.assertEquals(contact.mail_format(), 'test@domain.com') |
||||
contact = Contact(email='test@domain.com', first_name='Toto') |
||||
self.assertEquals(contact.mail_format(), 'test@domain.com') |
||||
contact = Contact(email='test@domain.com', first_name='Toto', last_name='Titi') |
||||
self.assertEquals(contact.mail_format(), 'Titi Toto <test@domain.com>') |
||||
|
||||
def test_vcard_format(self): |
||||
contact = Contact(email='test@domain.com', first_name='Toto', last_name='Titi') |
||||
self.assertEquals(contact.vcard_format(), 'BEGIN:VCARD\r\nVERSION:3.0\r\n'\ |
||||
'EMAIL;TYPE=INTERNET:test@domain.com\r\nFN:Toto Titi\r\n'\ |
||||
'N:Titi;Toto;;;\r\nEND:VCARD\r\n') |
||||
|
||||
def test_subscriptions(self): |
||||
contact = Contact.objects.create(email='test@domain.com') |
||||
self.assertEquals(len(contact.subscriptions()), 0) |
||||
|
||||
self.mailinglist_1.subscribers.add(contact) |
||||
self.assertEquals(len(contact.subscriptions()), 1) |
||||
self.mailinglist_2.subscribers.add(contact) |
||||
self.assertEquals(len(contact.subscriptions()), 2) |
||||
|
||||
def test_unsubscriptions(self): |
||||
contact = Contact.objects.create(email='test@domain.com') |
||||
self.assertEquals(len(contact.unsubscriptions()), 0) |
||||
|
||||
self.mailinglist_1.unsubscribers.add(contact) |
||||
self.assertEquals(len(contact.unsubscriptions()), 1) |
||||
self.mailinglist_2.unsubscribers.add(contact) |
||||
self.assertEquals(len(contact.unsubscriptions()), 2) |
||||
|
||||
|
||||
class MailingListTestCase(TestCase): |
||||
"""Tests for the MailingList model""" |
||||
|
||||
def setUp(self): |
||||
self.contact_1 = Contact.objects.create(email='test1@domain.com') |
||||
self.contact_2 = Contact.objects.create(email='test2@domain.com', valid=False) |
||||
self.contact_3 = Contact.objects.create(email='test3@domain.com', subscriber=False) |
||||
self.contact_4 = Contact.objects.create(email='test4@domain.com') |
||||
|
||||
def test_subscribers_count(self): |
||||
mailinglist = MailingList(name='Test MailingList') |
||||
mailinglist.save() |
||||
self.assertEquals(mailinglist.subscribers_count(), 0) |
||||
mailinglist.subscribers.add(self.contact_1, self.contact_2, self.contact_3) |
||||
self.assertEquals(mailinglist.subscribers_count(), 3) |
||||
|
||||
def test_unsubscribers_count(self): |
||||
mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.assertEquals(mailinglist.unsubscribers_count(), 0) |
||||
mailinglist.unsubscribers.add(self.contact_1, self.contact_2, self.contact_3) |
||||
self.assertEquals(mailinglist.unsubscribers_count(), 3) |
||||
|
||||
def test_expedition_set(self): |
||||
mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.assertEquals(len(mailinglist.expedition_set()), 0) |
||||
mailinglist.subscribers.add(self.contact_1, self.contact_2, self.contact_3) |
||||
self.assertEquals(len(mailinglist.expedition_set()), 1) |
||||
mailinglist.subscribers.add(self.contact_4) |
||||
self.assertEquals(len(mailinglist.expedition_set()), 2) |
||||
mailinglist.unsubscribers.add(self.contact_4) |
||||
self.assertEquals(len(mailinglist.expedition_set()), 1) |
||||
|
||||
|
||||
class NewsletterTestCase(TestCase): |
||||
"""Tests for the Newsletter model""" |
||||
|
||||
def setUp(self): |
||||
self.server = SMTPServer.objects.create(name='Test SMTP', |
||||
host='smtp.domain.com') |
||||
self.contact = Contact.objects.create(email='test@domain.com') |
||||
self.mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.newsletter = Newsletter.objects.create(title='Test Newsletter', |
||||
content='Test Newsletter Content', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server) |
||||
|
||||
def test_mails_sent(self): |
||||
self.assertEquals(self.newsletter.mails_sent(), 0) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contact, |
||||
status=ContactMailingStatus.SENT_TEST) |
||||
self.assertEquals(self.newsletter.mails_sent(), 1) |
||||
|
||||
|
||||
class TokenizationTestCase(TestCase): |
||||
"""Tests for the tokenization process""" |
||||
|
||||
def setUp(self): |
||||
self.contact = Contact.objects.create(email='test@domain.com') |
||||
|
||||
def test_tokenize_untokenize(self): |
||||
uidb36, token = tokenize(self.contact) |
||||
self.assertEquals(untokenize(uidb36, token), self.contact) |
||||
self.assertRaises(Http404, untokenize, 'toto', token) |
||||
self.assertRaises(Http404, untokenize, uidb36, 'toto') |
||||
|
||||
|
||||
class MailerTestCase(TestCase): |
||||
"""Tests for the Mailer object""" |
||||
|
||||
def setUp(self): |
||||
self.server = SMTPServer.objects.create(name='Test SMTP', |
||||
host='smtp.domain.com', |
||||
mails_hour=100) |
||||
self.contacts = [Contact.objects.create(email='test1@domain.com'), |
||||
Contact.objects.create(email='test2@domain.com'), |
||||
Contact.objects.create(email='test3@domain.com'), |
||||
Contact.objects.create(email='test4@domain.com')] |
||||
self.mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.mailinglist.subscribers.add(*self.contacts) |
||||
self.newsletter = Newsletter.objects.create(title='Test Newsletter', |
||||
content='Test Newsletter Content', |
||||
slug='test-newsletter', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server, |
||||
status=Newsletter.WAITING) |
||||
self.newsletter.test_contacts.add(*self.contacts[:2]) |
||||
self.attachment = Attachment.objects.create(newsletter=self.newsletter, |
||||
title='Test attachment', |
||||
file_attachment=File(NamedTemporaryFile())) |
||||
|
||||
def test_expedition_list(self): |
||||
mailer = Mailer(self.newsletter, test=True) |
||||
self.assertEquals(len(mailer.expedition_list), 2) |
||||
self.server.mails_hour = 1 |
||||
self.assertEquals(len(mailer.expedition_list), 1) |
||||
|
||||
self.server.mails_hour = 100 |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertEquals(len(mailer.expedition_list), 4) |
||||
self.server.mails_hour = 3 |
||||
self.assertEquals(len(mailer.expedition_list), 3) |
||||
|
||||
self.server.mails_hour = 100 |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.SENT) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.SENT) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.SENT) |
||||
self.assertEquals(len(mailer.expedition_list), 2) |
||||
self.assertFalse(self.contacts[0] in mailer.expedition_list) |
||||
|
||||
def test_can_send(self): |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertTrue(mailer.can_send) |
||||
|
||||
# Checks credits |
||||
self.server.mails_hour = 1 |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.SENT) |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertFalse(mailer.can_send) |
||||
self.server.mails_hour = 10 |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertTrue(mailer.can_send) |
||||
|
||||
# Checks statut |
||||
self.newsletter.status = Newsletter.DRAFT |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertFalse(mailer.can_send) |
||||
mailer = Mailer(self.newsletter, test=True) |
||||
self.assertTrue(mailer.can_send) |
||||
|
||||
# Checks expedition time |
||||
self.newsletter.status = Newsletter.WAITING |
||||
self.newsletter.sending_date = datetime.now() + timedelta(hours=1) |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertFalse(mailer.can_send) |
||||
self.newsletter.sending_date = datetime.now() |
||||
mailer = Mailer(self.newsletter) |
||||
self.assertTrue(mailer.can_send) |
||||
|
||||
def test_run(self): |
||||
mailer = Mailer(self.newsletter) |
||||
mailer.smtp = FakeSMTP() |
||||
mailer.run() |
||||
self.assertEquals(mailer.smtp.mails_sent, 4) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.SENT, newsletter=self.newsletter).count(), 4) |
||||
|
||||
mailer = Mailer(self.newsletter, test=True) |
||||
mailer.smtp = FakeSMTP() |
||||
|
||||
mailer.run() |
||||
self.assertEquals(mailer.smtp.mails_sent, 2) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.SENT_TEST, newsletter=self.newsletter).count(), 2) |
||||
|
||||
mailer.smtp = None |
||||
|
||||
def test_update_newsletter_status(self): |
||||
mailer = Mailer(self.newsletter, test=True) |
||||
self.assertEquals(self.newsletter.status, Newsletter.WAITING) |
||||
mailer.update_newsletter_status() |
||||
self.assertEquals(self.newsletter.status, Newsletter.WAITING) |
||||
|
||||
mailer = Mailer(self.newsletter) |
||||
self.assertEquals(self.newsletter.status, Newsletter.WAITING) |
||||
mailer.update_newsletter_status() |
||||
self.assertEquals(self.newsletter.status, Newsletter.SENDING) |
||||
|
||||
for contact in self.contacts: |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=contact, |
||||
status=ContactMailingStatus.SENT) |
||||
mailer.update_newsletter_status() |
||||
self.assertEquals(self.newsletter.status, Newsletter.SENT) |
||||
|
||||
def test_update_newsletter_status_advanced(self): |
||||
self.server.mails_hour = 2 |
||||
self.server.save() |
||||
|
||||
mailer = Mailer(self.newsletter) |
||||
mailer.smtp = FakeSMTP() |
||||
mailer.run() |
||||
|
||||
self.assertEquals(mailer.smtp.mails_sent, 2) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.SENT, newsletter=self.newsletter).count(), 2) |
||||
self.assertEquals(self.newsletter.status, Newsletter.SENDING) |
||||
|
||||
self.server.mails_hour = 0 |
||||
self.server.save() |
||||
|
||||
mailer = Mailer(self.newsletter) |
||||
mailer.smtp = FakeSMTP() |
||||
mailer.run() |
||||
|
||||
self.assertEquals(mailer.smtp.mails_sent, 2) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.SENT, newsletter=self.newsletter).count(), 4) |
||||
self.assertEquals(self.newsletter.status, Newsletter.SENT) |
||||
|
||||
def test_recipients_refused(self): |
||||
server = SMTPServer.objects.create(name='Local SMTP', |
||||
host='localhost') |
||||
contact = Contact.objects.create(email='thisisaninvalidemail') |
||||
self.newsletter.test_contacts.clear() |
||||
self.newsletter.test_contacts.add(contact) |
||||
self.newsletter.server = server |
||||
self.newsletter.save() |
||||
|
||||
self.assertEquals(contact.valid, True) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.INVALID, newsletter=self.newsletter).count(), 0) |
||||
|
||||
mailer = Mailer(self.newsletter, test=True) |
||||
mailer.run() |
||||
|
||||
self.assertEquals(Contact.objects.get(email='thisisaninvalidemail').valid, False) |
||||
self.assertEquals(ContactMailingStatus.objects.filter( |
||||
status=ContactMailingStatus.INVALID, newsletter=self.newsletter).count(), 1) |
||||
|
||||
|
||||
class StatisticsTestCase(TestCase): |
||||
"""Tests for the statistics functions""" |
||||
|
||||
def setUp(self): |
||||
self.server = SMTPServer.objects.create(name='Test SMTP', |
||||
host='smtp.domain.com') |
||||
self.contacts = [Contact.objects.create(email='test1@domain.com'), |
||||
Contact.objects.create(email='test2@domain.com'), |
||||
Contact.objects.create(email='test3@domain.com'), |
||||
Contact.objects.create(email='test4@domain.com')] |
||||
self.mailinglist = MailingList.objects.create(name='Test MailingList') |
||||
self.mailinglist.subscribers.add(*self.contacts) |
||||
self.newsletter = Newsletter.objects.create(title='Test Newsletter', |
||||
content='Test Newsletter Content', |
||||
mailing_list=self.mailinglist, |
||||
server=self.server, |
||||
status=Newsletter.SENT) |
||||
self.links = [Link.objects.create(title='link 1', url='htt://link.1'), |
||||
Link.objects.create(title='link 2', url='htt://link.2')] |
||||
|
||||
for contact in self.contacts: |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=contact, |
||||
status=ContactMailingStatus.SENT) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.SENT_TEST) |
||||
|
||||
self.recipients = len(self.contacts) |
||||
self.status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
def test_get_newsletter_opening_statistics(self): |
||||
stats = get_newsletter_opening_statistics(self.status, self.recipients) |
||||
self.assertEquals(stats['total_openings'], 0) |
||||
self.assertEquals(stats['unique_openings'], 0) |
||||
self.assertEquals(stats['double_openings'], 0) |
||||
self.assertEquals(stats['unique_openings_percent'], 0) |
||||
self.assertEquals(stats['unknow_openings'], 0) |
||||
self.assertEquals(stats['unknow_openings_percent'], 0) |
||||
self.assertEquals(stats['opening_average'], 0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_opening_statistics(status, self.recipients) |
||||
self.assertEquals(stats['total_openings'], 4) |
||||
self.assertEquals(stats['unique_openings'], 3) |
||||
self.assertEquals(stats['double_openings'], 1) |
||||
self.assertEquals(stats['unique_openings_percent'], 75.0) |
||||
self.assertEquals(stats['unknow_openings'], 1) |
||||
self.assertEquals(stats['unknow_openings_percent'], 25.0) |
||||
self.assertEquals(stats['opening_average'], 1.3333333333333333) |
||||
self.assertEquals(stats['opening_deducted'], 0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[3], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[3], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_opening_statistics(status, self.recipients) |
||||
self.assertEquals(stats['total_openings'], 5) |
||||
self.assertEquals(stats['unique_openings'], 4) |
||||
self.assertEquals(stats['double_openings'], 1) |
||||
self.assertEquals(stats['unique_openings_percent'], 100.0) |
||||
self.assertEquals(stats['unknow_openings'], 0) |
||||
self.assertEquals(stats['unknow_openings_percent'], 0.0) |
||||
self.assertEquals(stats['opening_average'], 1.25) |
||||
self.assertEquals(stats['opening_deducted'], 1) |
||||
|
||||
def test_get_newsletter_on_site_opening_statistics(self): |
||||
stats = get_newsletter_on_site_opening_statistics(self.status) |
||||
self.assertEquals(stats['total_on_site_openings'], 0) |
||||
self.assertEquals(stats['unique_on_site_openings'], 0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_on_site_opening_statistics(status) |
||||
self.assertEquals(stats['total_on_site_openings'], 4) |
||||
self.assertEquals(stats['unique_on_site_openings'], 3) |
||||
|
||||
def test_get_newsletter_clicked_link_statistics(self): |
||||
stats = get_newsletter_clicked_link_statistics(self.status, self.recipients, 0) |
||||
self.assertEquals(stats['total_clicked_links'], 0) |
||||
self.assertEquals(stats['total_clicked_links_percent'], 0) |
||||
self.assertEquals(stats['double_clicked_links'], 0) |
||||
self.assertEquals(stats['double_clicked_links_percent'], 0.0) |
||||
self.assertEquals(stats['unique_clicked_links'], 0) |
||||
self.assertEquals(stats['unique_clicked_links_percent'], 0) |
||||
self.assertEquals(stats['clicked_links_by_openings'], 0.0) |
||||
self.assertEquals(stats['clicked_links_average'], 0.0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[1], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[1], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_clicked_link_statistics(status, self.recipients, 3) |
||||
self.assertEquals(stats['total_clicked_links'], 5) |
||||
self.assertEquals(stats['total_clicked_links_percent'], 125.0) |
||||
self.assertEquals(stats['double_clicked_links'], 2) |
||||
self.assertEquals(stats['double_clicked_links_percent'], 50.0) |
||||
self.assertEquals(stats['unique_clicked_links'], 3) |
||||
self.assertEquals(stats['unique_clicked_links_percent'], 75.0) |
||||
self.assertEquals(stats['clicked_links_by_openings'], 166.66666666666669) |
||||
self.assertEquals(stats['clicked_links_average'], 1.6666666666666667) |
||||
|
||||
def test_get_newsletter_unsubscription_statistics(self): |
||||
stats = get_newsletter_unsubscription_statistics(self.status, self.recipients) |
||||
self.assertEquals(stats['total_unsubscriptions'], 0) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 0.0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
|
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_unsubscription_statistics(status, self.recipients) |
||||
self.assertEquals(stats['total_unsubscriptions'], 2) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 50.0) |
||||
|
||||
def test_get_newsletter_unsubscription_statistics_fix_doublon(self): |
||||
stats = get_newsletter_unsubscription_statistics(self.status, self.recipients) |
||||
self.assertEquals(stats['total_unsubscriptions'], 0) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 0.0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
|
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_unsubscription_statistics(status, self.recipients) |
||||
self.assertEquals(stats['total_unsubscriptions'], 2) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 50.0) |
||||
|
||||
def test_get_newsletter_top_links(self): |
||||
stats = get_newsletter_top_links(self.status) |
||||
self.assertEquals(stats['top_links'], []) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[1], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
status = ContactMailingStatus.objects.filter(newsletter=self.newsletter) |
||||
|
||||
stats = get_newsletter_top_links(status) |
||||
self.assertEquals(len(stats['top_links']), 2) |
||||
self.assertEquals(stats['top_links'][0]['link'], self.links[0]) |
||||
self.assertEquals(stats['top_links'][0]['total_clicks'], 4) |
||||
self.assertEquals(stats['top_links'][0]['unique_clicks'], 3) |
||||
self.assertEquals(stats['top_links'][1]['link'], self.links[1]) |
||||
self.assertEquals(stats['top_links'][1]['total_clicks'], 1) |
||||
self.assertEquals(stats['top_links'][1]['unique_clicks'], 1) |
||||
|
||||
def test_get_newsletter_statistics(self): |
||||
stats = get_newsletter_statistics(self.newsletter) |
||||
|
||||
self.assertEquals(stats['clicked_links_average'], 0.0) |
||||
self.assertEquals(stats['clicked_links_by_openings'], 0.0) |
||||
self.assertEquals(stats['double_clicked_links'], 0) |
||||
self.assertEquals(stats['double_clicked_links_percent'], 00.0) |
||||
self.assertEquals(stats['double_openings'], 0) |
||||
self.assertEquals(stats['mails_sent'], 4) |
||||
self.assertEquals(stats['mails_to_send'], 4) |
||||
self.assertEquals(stats['opening_average'], 0) |
||||
self.assertEquals(stats['remaining_mails'], 0) |
||||
self.assertEquals(stats['tests_sent'], 1) |
||||
self.assertEquals(stats['top_links'], []) |
||||
self.assertEquals(stats['total_clicked_links'], 0) |
||||
self.assertEquals(stats['total_clicked_links_percent'], 0.0) |
||||
self.assertEquals(stats['total_on_site_openings'], 0) |
||||
self.assertEquals(stats['total_openings'], 0) |
||||
self.assertEquals(stats['total_unsubscriptions'], 0) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 0.0) |
||||
self.assertEquals(stats['unique_clicked_links'], 0) |
||||
self.assertEquals(stats['unique_clicked_links_percent'], 0.0) |
||||
self.assertEquals(stats['unique_on_site_openings'], 0) |
||||
self.assertEquals(stats['unique_openings'], 0) |
||||
self.assertEquals(stats['unique_openings_percent'], 0) |
||||
self.assertEquals(stats['unknow_openings'], 0) |
||||
self.assertEquals(stats['unknow_openings_percent'], 0.0) |
||||
|
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
status=ContactMailingStatus.OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
status=ContactMailingStatus.OPENED_ON_SITE) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[1], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
link=self.links[1], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[1], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[2], |
||||
link=self.links[0], |
||||
status=ContactMailingStatus.LINK_OPENED) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.UNSUBSCRIPTION) |
||||
|
||||
stats = get_newsletter_statistics(self.newsletter) |
||||
|
||||
self.assertEquals(stats['clicked_links_average'], 1.6666666666666667) |
||||
self.assertEquals(stats['clicked_links_by_openings'], 100.0) |
||||
self.assertEquals(stats['double_clicked_links'], 2) |
||||
self.assertEquals(stats['double_clicked_links_percent'], 50.0) |
||||
self.assertEquals(stats['double_openings'], 2) |
||||
self.assertEquals(stats['mails_sent'], 4) |
||||
self.assertEquals(stats['mails_to_send'], 4) |
||||
self.assertEquals(stats['opening_average'], 1.6666666666666667) |
||||
self.assertEquals(stats['remaining_mails'], 0) |
||||
self.assertEquals(stats['tests_sent'], 1) |
||||
self.assertEquals(stats['total_clicked_links'], 5) |
||||
self.assertEquals(stats['total_clicked_links_percent'], 125.0) |
||||
self.assertEquals(stats['total_on_site_openings'], 2) |
||||
self.assertEquals(stats['total_openings'], 5) |
||||
self.assertEquals(stats['total_unsubscriptions'], 1) |
||||
self.assertEquals(stats['total_unsubscriptions_percent'], 25.0) |
||||
self.assertEquals(stats['unique_clicked_links'], 3) |
||||
self.assertEquals(stats['unique_clicked_links_percent'], 75.0) |
||||
self.assertEquals(stats['unique_on_site_openings'], 2) |
||||
self.assertEquals(stats['unique_openings'], 3) |
||||
self.assertEquals(stats['unique_openings_percent'], 75) |
||||
self.assertEquals(stats['unknow_openings'], 1) |
||||
self.assertEquals(stats['unknow_openings_percent'], 25.0) |
||||
|
||||
def test_get_newsletter_statistics_division_by_zero(self): |
||||
"""Try to have a ZeroDivisionError by unsubscribing all contacts, |
||||
and creating a ContactMailingStatus for more code coverage. |
||||
Bug : http://github.com/Fantomas42/emencia-django-newsletter/issues#issue/9""" |
||||
get_newsletter_statistics(self.newsletter) |
||||
|
||||
self.mailinglist.unsubscribers.add(*self.contacts) |
||||
ContactMailingStatus.objects.create(newsletter=self.newsletter, |
||||
contact=self.contacts[0], |
||||
status=ContactMailingStatus.OPENED) |
||||
get_newsletter_statistics(self.newsletter) |
||||
@ -0,0 +1,16 @@ |
||||
"""Settings for testing emencia.django.newsletter""" |
||||
|
||||
SITE_ID = 1 |
||||
|
||||
USE_I18N = False |
||||
|
||||
ROOT_URLCONF = 'emencia.django.newsletter.urls' |
||||
|
||||
DATABASES = {'default': {'NAME': 'newsletter_tests.db', |
||||
'ENGINE': 'django.db.backends.sqlite3'}} |
||||
|
||||
INSTALLED_APPS = ['django.contrib.contenttypes', |
||||
'django.contrib.sites', |
||||
'django.contrib.auth', |
||||
'tagging', |
||||
'emencia.django.newsletter'] |
||||
@ -0,0 +1,20 @@ |
||||
"""Default urls for the emencia.django.newsletter""" |
||||
from django.conf.urls import url |
||||
from django.conf.urls import include |
||||
from django.conf.urls import patterns |
||||
from django.views.generic.base import TemplateView |
||||
from emencia.django.newsletter.views.expo_views import SubscribeView, ActivationView |
||||
|
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^mailing/', include('emencia.django.newsletter.urls.mailing_list')), |
||||
url(r'^tracking/', include('emencia.django.newsletter.urls.tracking')), |
||||
url(r'^statistics/', include('emencia.django.newsletter.urls.statistics')), |
||||
url(r'^', include('emencia.django.newsletter.urls.newsletter')), |
||||
|
||||
url(r'^test-letter/', TemplateView.as_view(template_name='client/newsletters/announce_template.html')), |
||||
url(r'^activation/complete/', TemplateView.as_view(template_name='client/newsletters/activation_complete.html'), |
||||
name='subscription_activation_complete'), |
||||
url(r'^activate/(?P<activation_key>.*)/$', ActivationView.as_view(), name='subscription_activation'), |
||||
url(r'^', SubscribeView.as_view(), name='newsletter_subscription'), |
||||
) |
||||
@ -0,0 +1,20 @@ |
||||
"""Urls for the emencia.django.newsletter Mailing List""" |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
|
||||
from emencia.django.newsletter.forms import MailingListSubscriptionForm |
||||
from emencia.django.newsletter.forms import AllMailingListSubscriptionForm |
||||
|
||||
urlpatterns = patterns('emencia.django.newsletter.views.mailing_list', |
||||
url(r'^unsubscribe/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', |
||||
'view_mailinglist_unsubscribe', |
||||
name='newsletter_mailinglist_unsubscribe'), |
||||
url(r'^subscribe/(?P<mailing_list_id>\d+)/', |
||||
'view_mailinglist_subscribe', |
||||
{'form_class': MailingListSubscriptionForm}, |
||||
name='newsletter_mailinglist_subscribe'), |
||||
url(r'^subscribe/', |
||||
'view_mailinglist_subscribe', |
||||
{'form_class': AllMailingListSubscriptionForm}, |
||||
name='newsletter_mailinglist_subscribe_all'), |
||||
) |
||||
@ -0,0 +1,12 @@ |
||||
"""Urls for the emencia.django.newsletter Newsletter""" |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
|
||||
urlpatterns = patterns('emencia.django.newsletter.views.newsletter', |
||||
url(r'^preview/(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_preview', |
||||
name='newsletter_newsletter_preview'), |
||||
url(r'^(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', |
||||
'view_newsletter_contact', |
||||
name='newsletter_newsletter_contact'), |
||||
) |
||||
@ -0,0 +1,18 @@ |
||||
"""Urls for the emencia.django.newsletter statistics""" |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
|
||||
urlpatterns = patterns('emencia.django.newsletter.views.statistics', |
||||
url(r'^(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_statistics', |
||||
name='newsletter_newsletter_statistics'), |
||||
url(r'^report/(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_report', |
||||
name='newsletter_newsletter_report'), |
||||
url(r'^charts/(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_charts', |
||||
name='newsletter_newsletter_charts'), |
||||
url(r'^density/(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_density', |
||||
name='newsletter_newsletter_density'), |
||||
) |
||||
@ -0,0 +1,15 @@ |
||||
"""Urls for the emencia.django.newsletter Tracking""" |
||||
from django.conf.urls.defaults import url |
||||
from django.conf.urls.defaults import patterns |
||||
|
||||
urlpatterns = patterns('emencia.django.newsletter.views.tracking', |
||||
url(r'^newsletter/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)\.(?P<format>png|gif|jpg)$', |
||||
'view_newsletter_tracking', |
||||
name='newsletter_newsletter_tracking'), |
||||
url(r'^link/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/(?P<link_id>\d+)/$', |
||||
'view_newsletter_tracking_link', |
||||
name='newsletter_newsletter_tracking_link'), |
||||
url(r'^historic/(?P<slug>[-\w]+)/$', |
||||
'view_newsletter_historic', |
||||
name='newsletter_newsletter_historic'), |
||||
) |
||||
@ -0,0 +1,28 @@ |
||||
"""Utils for emencia.django.newsletter""" |
||||
from django.template import Context, Template |
||||
import random |
||||
from datetime import datetime |
||||
try: |
||||
from hashlib import sha1 |
||||
except ImportError: |
||||
from django.utils.hashcompat import sha_constructor as sha1 |
||||
|
||||
|
||||
|
||||
|
||||
def render_string(template_string, context={}): |
||||
"""Shortcut for render a template string with a context""" |
||||
t = Template(template_string) |
||||
c = Context(context) |
||||
return t.render(c) |
||||
|
||||
|
||||
def make_activation_code(): |
||||
""" Generate a unique activation code. """ |
||||
random_string = str(random.random()) |
||||
random_digest = sha1(random_string).hexdigest()[:5] |
||||
time_string = str(datetime.now().microsecond) |
||||
|
||||
combined_string = random_digest + time_string |
||||
|
||||
return sha1(combined_string).hexdigest() |
||||
@ -0,0 +1,78 @@ |
||||
"""ExcelResponse for emencia.django.newsletter""" |
||||
# Based on http://www.djangosnippets.org/snippets/1151/ |
||||
import datetime |
||||
|
||||
from django.http import HttpResponse |
||||
from django.db.models.query import QuerySet |
||||
from django.db.models.query import ValuesQuerySet |
||||
|
||||
|
||||
class ExcelResponse(HttpResponse): |
||||
"""ExcelResponse feeded by queryset""" |
||||
|
||||
def __init__(self, data, output_name='excel_data', headers=None, |
||||
force_csv=False, encoding='utf8'): |
||||
valid_data = False |
||||
if isinstance(data, ValuesQuerySet): |
||||
data = list(data) |
||||
elif isinstance(data, QuerySet): |
||||
data = list(data.values()) |
||||
if hasattr(data, '__getitem__'): |
||||
if isinstance(data[0], dict): |
||||
if headers is None: |
||||
headers = data[0].keys() |
||||
data = [[row[col] for col in headers] for row in data] |
||||
data.insert(0, headers) |
||||
if hasattr(data[0], '__getitem__'): |
||||
valid_data = True |
||||
assert valid_data is True, "ExcelResponse requires a sequence of sequences" |
||||
|
||||
import StringIO |
||||
output = StringIO.StringIO() |
||||
# Excel has a limit on number of rows; if we have more than that, make a csv |
||||
use_xls = False |
||||
if len(data) <= 65536 and force_csv is not True: |
||||
try: |
||||
import xlwt |
||||
except ImportError: |
||||
pass |
||||
else: |
||||
use_xls = True |
||||
if use_xls: |
||||
book = xlwt.Workbook(encoding=encoding) |
||||
sheet = book.add_sheet('Sheet 1') |
||||
styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'), |
||||
'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'), |
||||
'time': xlwt.easyxf(num_format_str='hh:mm:ss'), |
||||
'default': xlwt.Style.default_style} |
||||
for rowx, row in enumerate(data): |
||||
for colx, value in enumerate(row): |
||||
if isinstance(value, datetime.datetime): |
||||
cell_style = styles['datetime'] |
||||
elif isinstance(value, datetime.date): |
||||
cell_style = styles['date'] |
||||
elif isinstance(value, datetime.time): |
||||
cell_style = styles['time'] |
||||
else: |
||||
cell_style = styles['default'] |
||||
sheet.write(rowx, colx, value, style=cell_style) |
||||
book.save(output) |
||||
mimetype = 'application/vnd.ms-excel' |
||||
file_ext = 'xls' |
||||
else: |
||||
for row in data: |
||||
out_row = [] |
||||
for value in row: |
||||
if not isinstance(value, basestring): |
||||
value = unicode(value) |
||||
value = value.encode(encoding) |
||||
out_row.append(value.replace('"', '""')) |
||||
output.write('"%s"\n' % |
||||
'","'.join(out_row)) |
||||
mimetype = 'text/csv' |
||||
file_ext = 'csv' |
||||
output.seek(0) |
||||
super(ExcelResponse, self).__init__(content=output.getvalue(), |
||||
mimetype=mimetype) |
||||
self['Content-Disposition'] = 'attachment;filename="%s.%s"' % \ |
||||
(output_name.replace('"', '\"'), file_ext) |
||||
@ -0,0 +1,122 @@ |
||||
"""Utils for importation of contacts""" |
||||
import csv |
||||
from datetime import datetime |
||||
|
||||
import xlrd |
||||
import vobject |
||||
|
||||
from django.core.validators import validate_email |
||||
from django.core.exceptions import ValidationError |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
|
||||
from tagging.models import Tag |
||||
|
||||
from emencia.django.newsletter.models import Contact |
||||
from emencia.django.newsletter.models import MailingList |
||||
|
||||
|
||||
COLUMNS = ['email', 'first_name', 'last_name', 'tags'] |
||||
csv.register_dialect('edn', delimiter=';') |
||||
|
||||
|
||||
def create_contact(contact_dict, workgroups=[]): |
||||
"""Create a contact and validate the mail""" |
||||
contact_dict['email'] = contact_dict['email'].strip() |
||||
try: |
||||
validate_email(contact_dict['email']) |
||||
contact_dict['valid'] = True |
||||
except ValidationError: |
||||
contact_dict['valid'] = False |
||||
|
||||
contact, created = Contact.objects.get_or_create( |
||||
email=contact_dict['email'], |
||||
defaults=contact_dict) |
||||
|
||||
if not created: |
||||
new_tags = contact_dict.get('tags') |
||||
if new_tags: |
||||
Tag.objects.update_tags(contact, '%s, %s' % (contact.tags, new_tags)) |
||||
|
||||
for workgroup in workgroups: |
||||
workgroup.contacts.add(contact) |
||||
|
||||
return contact, created |
||||
|
||||
|
||||
def create_contacts(contact_dicts, importer_name, workgroups=[]): |
||||
"""Create all the contacts to import and |
||||
associated them in a mailing list""" |
||||
inserted = 0 |
||||
when = str(datetime.now()).split('.')[0] |
||||
mailing_list = MailingList( |
||||
name=_('Mailing list created by importation at %s') % when, |
||||
description=_('Contacts imported by %s.') % importer_name) |
||||
mailing_list.save() |
||||
|
||||
for workgroup in workgroups: |
||||
workgroup.mailinglists.add(mailing_list) |
||||
|
||||
for contact_dict in contact_dicts: |
||||
contact, created = create_contact(contact_dict, workgroups) |
||||
mailing_list.subscribers.add(contact) |
||||
inserted += int(created) |
||||
|
||||
return inserted |
||||
|
||||
|
||||
def vcard_contacts_import(stream, workgroups=[]): |
||||
"""Import contacts from a VCard file""" |
||||
contacts = [] |
||||
vcards = vobject.readComponents(stream) |
||||
|
||||
for vcard in vcards: |
||||
contact = {'email': vcard.email.value, |
||||
'first_name': vcard.n.value.given, |
||||
'last_name': vcard.n.value.family} |
||||
contacts.append(contact) |
||||
|
||||
return create_contacts(contacts, 'vcard', workgroups) |
||||
|
||||
|
||||
def text_contacts_import(stream, workgroups=[]): |
||||
"""Import contact from a plaintext file, like CSV""" |
||||
contacts = [] |
||||
contact_reader = csv.reader(stream, dialect='edn') |
||||
|
||||
for contact_row in contact_reader: |
||||
contact = {} |
||||
for i in range(len(contact_row)): |
||||
contact[COLUMNS[i]] = contact_row[i] |
||||
contacts.append(contact) |
||||
|
||||
return create_contacts(contacts, 'text', workgroups) |
||||
|
||||
|
||||
def excel_contacts_import(stream, workgroups=[]): |
||||
"""Import contacts from an Excel file""" |
||||
contacts = [] |
||||
wb = xlrd.open_workbook(file_contents=stream.read()) |
||||
sh = wb.sheet_by_index(0) |
||||
|
||||
for row in range(sh.nrows): |
||||
contact = {} |
||||
for i in range(len(COLUMNS)): |
||||
try: |
||||
value = sh.cell(row, i).value |
||||
contact[COLUMNS[i]] = value |
||||
except IndexError: |
||||
break |
||||
contacts.append(contact) |
||||
|
||||
return create_contacts(contacts, 'excel', workgroups) |
||||
|
||||
|
||||
def import_dispatcher(source, type_, workgroups): |
||||
"""Select importer and import contacts""" |
||||
if type_ == 'vcard': |
||||
return vcard_contacts_import(source, workgroups) |
||||
elif type_ == 'text': |
||||
return text_contacts_import(source, workgroups) |
||||
elif type_ == 'excel': |
||||
return excel_contacts_import(source, workgroups) |
||||
return 0 |
||||
@ -0,0 +1,47 @@ |
||||
"""Utils for newsletter""" |
||||
from BeautifulSoup import BeautifulSoup |
||||
from django.core.urlresolvers import reverse |
||||
|
||||
from emencia.django.newsletter.models import Link |
||||
from emencia.django.newsletter.settings import USE_PRETTIFY |
||||
|
||||
|
||||
def body_insertion(content, insertion, end=False): |
||||
"""Insert an HTML content into the body HTML node""" |
||||
if not content.startswith('<body'): |
||||
content = '<body>%s</body>' % content |
||||
soup = BeautifulSoup(content) |
||||
|
||||
if end: |
||||
soup.body.append(insertion) |
||||
else: |
||||
soup.body.insert(0, insertion) |
||||
|
||||
if USE_PRETTIFY: |
||||
return soup.prettify() |
||||
else: |
||||
return soup.renderContents() |
||||
|
||||
|
||||
def track_links(content, context): |
||||
"""Convert all links in the template for the user |
||||
to track his navigation""" |
||||
if not context.get('uidb36'): |
||||
return content |
||||
|
||||
soup = BeautifulSoup(content) |
||||
for link_markup in soup('a'): |
||||
if link_markup.get('href') and \ |
||||
'no-track' not in link_markup.get('rel', ''): |
||||
link_href = link_markup['href'] |
||||
link_title = link_markup.get('title', link_href) |
||||
link, created = Link.objects.get_or_create(url=link_href, |
||||
defaults={'title': link_title}) |
||||
link_markup['href'] = 'http://%s%s' % (context['domain'], reverse('newsletter_newsletter_tracking_link', |
||||
args=[context['newsletter'].slug, |
||||
context['uidb36'], context['token'], |
||||
link.pk])) |
||||
if USE_PRETTIFY: |
||||
return soup.prettify() |
||||
else: |
||||
return soup.renderContents() |
||||
@ -0,0 +1,59 @@ |
||||
# This program is free software; you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation; version 2 of the License. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# Author: Eugene Kin Chee Yip |
||||
# Date: 16 January 2010 |
||||
# Modified by: Fantomas42 |
||||
|
||||
import copy |
||||
|
||||
from django.utils.simplejson import dumps |
||||
|
||||
|
||||
class Chart(dict): |
||||
replaceKeyDictionary = { |
||||
'on_show': 'on-show', 'on_click': 'on-click', |
||||
'start_angle': 'start-angle', 'javascript_function': 'javascript-function', |
||||
'threeD': '3d', 'tick_height': 'tick-height', |
||||
'grid_colour': 'grid-colour', 'tick_length': 'tick-length', |
||||
'spoke_labels': 'spoke-labels', 'barb_length': 'barb-length', |
||||
'dot_style': 'dot-style', 'dot_size': 'dot-size', |
||||
'halo_size': 'halo-size', 'line_style': 'line-style', |
||||
'outline_colour': 'outline-colour', 'fill_alpha': 'fill-alpha', |
||||
'gradient_fill': 'gradient-fill', 'negative_colour': 'negative-colour'} |
||||
|
||||
def __init__(self, *ka, **kw): |
||||
for key, value in kw.items(): |
||||
self.__dict__[key] = value |
||||
|
||||
def __getattribute__(self, key): |
||||
try: |
||||
return dict.__getattribute__(self, key) |
||||
except AttributeError: |
||||
self.__dict__[key] = Chart() |
||||
return dict.__getattribute__(self, key) |
||||
|
||||
def __copy__(self): |
||||
attributes = dict() |
||||
for key, value in self.__dict__.items(): |
||||
if isinstance(value, list): |
||||
attributes[self.replaceKey(key)] = [copy.copy(item) for item in value] |
||||
else: |
||||
attributes[self.replaceKey(key)] = copy.copy(value) |
||||
return attributes |
||||
|
||||
def replaceKey(self, key): |
||||
if (key in self.replaceKeyDictionary): |
||||
return self.replaceKeyDictionary[key] |
||||
else: |
||||
return key |
||||
|
||||
def render(self): |
||||
attributes = copy.copy(self) |
||||
return dumps(attributes) |
||||
@ -0,0 +1,205 @@ |
||||
"""Premailer for emencia.django.newsletter |
||||
Used for converting a page with CSS inline and links corrected. |
||||
Based on http://www.peterbe.com/plog/premailer.py""" |
||||
import re |
||||
from urllib2 import urlopen |
||||
from lxml.html import parse |
||||
from lxml.html import tostring |
||||
|
||||
|
||||
_css_comments = re.compile(r'/\*.*?\*/', re.MULTILINE | re.DOTALL) |
||||
_regex = re.compile('((.*?){(.*?)})', re.DOTALL | re.M) |
||||
_semicolon_regex = re.compile(';(\s+)') |
||||
_colon_regex = re.compile(':(\s+)') |
||||
|
||||
|
||||
def _merge_styles(old, new, class_=''): |
||||
""" |
||||
if :: |
||||
old = 'font-size:1px; color: red' |
||||
and :: |
||||
new = 'font-size:2px; font-weight: bold' |
||||
then :: |
||||
return 'color: red; font-size:2px; font-weight: bold' |
||||
|
||||
In other words, the new style bits replace the old ones. |
||||
|
||||
The @class_ parameter can be something like ':hover' and if that |
||||
is there, you split up the style with '{...} :hover{...}' |
||||
Note: old could be something like '{...} ::first-letter{...}' |
||||
""" |
||||
news = {} |
||||
for k, v in [x.strip().split(':', 1) for x in new.split(';') if x.strip()]: |
||||
news[k.strip()] = v.strip() |
||||
|
||||
groups = {} |
||||
grouping_regex = re.compile('([:\-\w]*){([^}]+)}') |
||||
grouped_split = grouping_regex.findall(old) |
||||
if grouped_split: |
||||
for old_class, old_content in grouped_split: |
||||
olds = {} |
||||
for k, v in [x.strip().split(':', 1) |
||||
for x in old_content.split(';') if x.strip()]: |
||||
olds[k.strip()] = v.strip() |
||||
groups[old_class] = olds |
||||
else: |
||||
olds = {} |
||||
for k, v in [x.strip().split(':', 1) |
||||
for x in old.split(';') if x.strip()]: |
||||
olds[k.strip()] = v.strip() |
||||
groups[''] = olds |
||||
|
||||
# Perform the merge |
||||
merged = news |
||||
for k, v in groups.get(class_, {}).items(): |
||||
if k not in merged: |
||||
merged[k] = v |
||||
groups[class_] = merged |
||||
|
||||
if len(groups) == 1: |
||||
return '; '.join(['%s:%s' % (k, v) |
||||
for (k, v) in groups.values()[0].items()]) |
||||
else: |
||||
all = [] |
||||
for class_, mergeable in sorted(groups.items(), |
||||
lambda x, y: cmp(x[0].count(':'), y[0].count(':'))): |
||||
all.append('%s{%s}' % (class_, |
||||
'; '.join(['%s:%s' % (k, v) |
||||
for (k, v) |
||||
in mergeable.items()]))) |
||||
return ' '.join([x for x in all if x != '{}']) |
||||
|
||||
|
||||
class PremailerError(Exception): |
||||
pass |
||||
|
||||
|
||||
class Premailer(object): |
||||
"""Premailer for converting a webpage |
||||
to be e-mail ready""" |
||||
|
||||
def __init__(self, url, include_star_selectors=False): |
||||
self.url = url |
||||
try: |
||||
self.page = parse(self.url).getroot() |
||||
except: |
||||
raise PremailerError('Could not parse the html') |
||||
|
||||
self.include_star_selectors = include_star_selectors |
||||
|
||||
def transform(self): |
||||
"""Do some transformations to self.page |
||||
for being e-mail compliant""" |
||||
self.page.make_links_absolute(self.url) |
||||
|
||||
self.inline_rules(self.get_page_rules()) |
||||
self.clean_page() |
||||
# Do it a second time for correcting |
||||
# ressources added by inlining. |
||||
# Will not work as expected if medias |
||||
# are located in other domain. |
||||
self.page.make_links_absolute(self.url) |
||||
|
||||
return tostring(self.page.body) |
||||
|
||||
def get_page_rules(self): |
||||
"""Retrieve CSS rules in the <style> markups |
||||
and in the external CSS files""" |
||||
rules = [] |
||||
for style in self.page.cssselect('style'): |
||||
css_body = tostring(style) |
||||
css_body = css_body.split('>')[1].split('</')[0] |
||||
these_rules, these_leftover = self._parse_style_rules(css_body) |
||||
rules.extend(these_rules) |
||||
|
||||
for external_css in self.page.cssselect('link'): |
||||
attr = external_css.attrib |
||||
if attr.get('rel', '').lower() == 'stylesheet' and \ |
||||
attr.get('href'): |
||||
media = attr.get('media', 'screen') |
||||
for media_allowed in ('all', 'screen', 'projection'): |
||||
if media_allowed in media: |
||||
css = urlopen(attr['href']).read() |
||||
rules.extend(self._parse_style_rules(css)[0]) |
||||
break |
||||
|
||||
return rules |
||||
|
||||
def inline_rules(self, rules): |
||||
"""Apply in the page inline the CSS rules""" |
||||
for selector, style in rules: |
||||
class_ = '' |
||||
if ':' in selector: |
||||
selector, class_ = re.split(':', selector, 1) |
||||
class_ = ':%s' % class_ |
||||
|
||||
for item in self.page.cssselect(selector): |
||||
old_style = item.attrib.get('style', '') |
||||
new_style = _merge_styles(old_style, style, class_) |
||||
item.attrib['style'] = new_style |
||||
self._style_to_basic_html_attributes(item, new_style) |
||||
|
||||
def clean_page(self): |
||||
"""Clean the page of useless parts""" |
||||
for elem in self.page.xpath('//@class'): |
||||
parent = elem.getparent() |
||||
del parent.attrib['class'] |
||||
for elem in self.page.cssselect('style'): |
||||
elem.getparent().remove(elem) |
||||
for elem in self.page.cssselect('script'): |
||||
elem.getparent().remove(elem) |
||||
|
||||
def _parse_style_rules(self, css_body): |
||||
leftover = [] |
||||
rules = [] |
||||
css_body = _css_comments.sub('', css_body) |
||||
for each in _regex.findall(css_body.strip()): |
||||
__, selectors, bulk = each |
||||
bulk = _semicolon_regex.sub(';', bulk.strip()) |
||||
bulk = _colon_regex.sub(':', bulk.strip()) |
||||
if bulk.endswith(';'): |
||||
bulk = bulk[:-1] |
||||
for selector in [x.strip() |
||||
for x in selectors.split(',') if x.strip()]: |
||||
if ':' in selector: |
||||
# A pseudoclass |
||||
leftover.append((selector, bulk)) |
||||
continue |
||||
elif selector == '*' and not self.include_star_selectors: |
||||
continue |
||||
|
||||
rules.append((selector, bulk)) |
||||
|
||||
return rules, leftover |
||||
|
||||
def _style_to_basic_html_attributes(self, element, style_content): |
||||
"""Given an element and styles like |
||||
'background-color:red; font-family:Arial' turn some of that into HTML |
||||
attributes. like 'bgcolor', etc. |
||||
Note, the style_content can contain pseudoclasses like: |
||||
'{color:red; border:1px solid green} :visited{border:1px solid green}' |
||||
""" |
||||
if style_content.count('}') and \ |
||||
style_content.count('{') == style_content.count('{'): |
||||
style_content = style_content.split('}')[0][1:] |
||||
|
||||
attributes = {} |
||||
for key, value in [x.split(':') for x in style_content.split(';') |
||||
if len(x.split(':')) == 2]: |
||||
key = key.strip() |
||||
|
||||
if key == 'text-align': |
||||
attributes['align'] = value.strip() |
||||
elif key == 'background-color': |
||||
attributes['bgcolor'] = value.strip() |
||||
elif key == 'width': |
||||
value = value.strip() |
||||
if value.endswith('px'): |
||||
value = value[:-2] |
||||
attributes['width'] = value |
||||
|
||||
for key, value in attributes.items(): |
||||
if key in element.attrib: |
||||
# Already set, don't dare to overwrite |
||||
continue |
||||
element.attrib[key] = value |
||||
@ -0,0 +1,130 @@ |
||||
"""Statistics for emencia.django.newsletter""" |
||||
from django.db.models import Q |
||||
|
||||
from emencia.django.newsletter.models import ContactMailingStatus as Status |
||||
|
||||
|
||||
def smart_division(a, b): |
||||
"""Not a really smart division, but avoid |
||||
to have ZeroDivisionError""" |
||||
try: |
||||
return float(a) / float(b) |
||||
except ZeroDivisionError: |
||||
return 0.0 |
||||
|
||||
|
||||
def get_newsletter_opening_statistics(status, recipients): |
||||
"""Return opening statistics of a newsletter based on status""" |
||||
openings = status.filter(Q(status=Status.OPENED) | Q(status=Status.OPENED_ON_SITE)) |
||||
|
||||
openings_by_links_opened = len(set(status.filter(status=Status.LINK_OPENED).exclude( |
||||
contact__in=openings.values_list('contact', flat=True)).values_list('contact', flat=True))) |
||||
|
||||
total_openings = openings.count() + openings_by_links_opened |
||||
if total_openings: |
||||
unique_openings = len(set(openings.values_list('contact', flat=True))) + openings_by_links_opened |
||||
unique_openings_percent = smart_division(unique_openings, recipients) * 100 |
||||
unknow_openings = recipients - unique_openings |
||||
unknow_openings_percent = smart_division(unknow_openings, recipients) * 100 |
||||
opening_average = smart_division(total_openings, unique_openings) |
||||
else: |
||||
unique_openings = unique_openings_percent = unknow_openings = \ |
||||
unknow_openings_percent = opening_average = 0 |
||||
|
||||
return {'total_openings': total_openings, |
||||
'double_openings': total_openings - unique_openings, |
||||
'unique_openings': unique_openings, |
||||
'unique_openings_percent': unique_openings_percent, |
||||
'unknow_openings': unknow_openings, |
||||
'unknow_openings_percent': unknow_openings_percent, |
||||
'opening_average': opening_average, |
||||
'opening_deducted': openings_by_links_opened} |
||||
|
||||
|
||||
def get_newsletter_on_site_opening_statistics(status): |
||||
"""Return on site opening statistics of a newsletter based on status""" |
||||
on_site_openings = status.filter(status=Status.OPENED_ON_SITE) |
||||
total_on_site_openings = on_site_openings.count() |
||||
unique_on_site_openings = len(set(on_site_openings.values_list('contact', flat=True))) |
||||
|
||||
return {'total_on_site_openings': total_on_site_openings, |
||||
'unique_on_site_openings': unique_on_site_openings} |
||||
|
||||
|
||||
def get_newsletter_clicked_link_statistics(status, recipients, openings): |
||||
"""Return clicked link statistics of a newsletter based on status""" |
||||
clicked_links = status.filter(status=Status.LINK_OPENED) |
||||
|
||||
total_clicked_links = clicked_links.count() |
||||
total_clicked_links_percent = smart_division(total_clicked_links, recipients) * 100 |
||||
|
||||
unique_clicked_links = len(set(clicked_links.values_list('contact', flat=True))) |
||||
unique_clicked_links_percent = smart_division(unique_clicked_links, recipients) * 100 |
||||
|
||||
double_clicked_links = total_clicked_links - unique_clicked_links |
||||
double_clicked_links_percent = smart_division(double_clicked_links, recipients) * 100 |
||||
|
||||
clicked_links_by_openings = openings and smart_division(total_clicked_links, openings) * 100 or 0.0 |
||||
|
||||
clicked_links_average = total_clicked_links and smart_division(total_clicked_links, unique_clicked_links) or 0.0 |
||||
|
||||
return {'total_clicked_links': total_clicked_links, |
||||
'total_clicked_links_percent': total_clicked_links_percent, |
||||
'double_clicked_links': double_clicked_links, |
||||
'double_clicked_links_percent': double_clicked_links_percent, |
||||
'unique_clicked_links': unique_clicked_links, |
||||
'unique_clicked_links_percent': unique_clicked_links_percent, |
||||
'clicked_links_by_openings': clicked_links_by_openings, |
||||
'clicked_links_average': clicked_links_average} |
||||
|
||||
|
||||
def get_newsletter_unsubscription_statistics(status, recipients): |
||||
unsubscriptions = status.filter(status=Status.UNSUBSCRIPTION) |
||||
|
||||
#Patch: multiple unsubsriptions logs could exist before a typo bug was corrected, a 'set' is needed |
||||
total_unsubscriptions = len(set(unsubscriptions.values_list('contact', flat=True))) |
||||
total_unsubscriptions_percent = smart_division(total_unsubscriptions, recipients) * 100 |
||||
|
||||
return {'total_unsubscriptions': total_unsubscriptions, |
||||
'total_unsubscriptions_percent': total_unsubscriptions_percent} |
||||
|
||||
|
||||
def get_newsletter_top_links(status): |
||||
"""Return the most clicked links""" |
||||
links = {} |
||||
clicked_links = status.filter(status=Status.LINK_OPENED) |
||||
|
||||
for cl in clicked_links: |
||||
links.setdefault(cl.link, 0) |
||||
links[cl.link] += 1 |
||||
|
||||
top_links = [] |
||||
for link, score in sorted(links.iteritems(), key=lambda (k, v): (v, k), reverse=True): |
||||
unique_clicks = len(set(clicked_links.filter(link=link).values_list('contact', flat=True))) |
||||
top_links.append({'link': link, |
||||
'total_clicks': score, |
||||
'unique_clicks': unique_clicks}) |
||||
|
||||
return {'top_links': top_links} |
||||
|
||||
|
||||
def get_newsletter_statistics(newsletter): |
||||
"""Return the statistics of a newsletter""" |
||||
recipients = newsletter.mailing_list.expedition_set().count() |
||||
all_status = Status.objects.filter(newsletter=newsletter) |
||||
post_sending_status = all_status.filter(creation_date__gte=newsletter.sending_date) |
||||
mails_sent = post_sending_status.filter(status=Status.SENT).count() |
||||
|
||||
statistics = {'tests_sent': all_status.filter(status=Status.SENT_TEST).count(), |
||||
'mails_sent': mails_sent, |
||||
'mails_to_send': recipients, |
||||
'remaining_mails': recipients - mails_sent} |
||||
|
||||
statistics.update(get_newsletter_opening_statistics(post_sending_status, recipients)) |
||||
statistics.update(get_newsletter_on_site_opening_statistics(post_sending_status)) |
||||
statistics.update(get_newsletter_unsubscription_statistics(post_sending_status, recipients)) |
||||
statistics.update(get_newsletter_clicked_link_statistics(post_sending_status, recipients, |
||||
statistics['total_openings'])) |
||||
statistics.update(get_newsletter_top_links(post_sending_status)) |
||||
|
||||
return statistics |
||||
@ -0,0 +1,44 @@ |
||||
"""Tokens system for emencia.django.newsletter""" |
||||
from django.conf import settings |
||||
from django.http import Http404 |
||||
from django.utils.http import int_to_base36, base36_to_int |
||||
|
||||
from emencia.django.newsletter.models import Contact |
||||
|
||||
|
||||
class ContactTokenGenerator(object): |
||||
"""ContactTokengenerator for the newsletter |
||||
based on the PasswordResetTokenGenerator bundled |
||||
in django.contrib.auth""" |
||||
|
||||
def make_token(self, contact): |
||||
"""Method for generating the token""" |
||||
from django.utils.hashcompat import sha_constructor |
||||
|
||||
token = sha_constructor(settings.SECRET_KEY + unicode(contact.id) + |
||||
contact.email).hexdigest()[::2] |
||||
return token |
||||
|
||||
def check_token(self, contact, token): |
||||
"""Check if the token is correct for this user""" |
||||
return token == self.make_token(contact) |
||||
|
||||
|
||||
def tokenize(contact): |
||||
"""Return the uid in base 36 of a contact, and a token""" |
||||
token_generator = ContactTokenGenerator() |
||||
return int_to_base36(contact.id), token_generator.make_token(contact) |
||||
|
||||
|
||||
def untokenize(uidb36, token): |
||||
"""Retrieve a contact by uidb36 and token""" |
||||
try: |
||||
contact_id = base36_to_int(uidb36) |
||||
contact = Contact.objects.get(pk=contact_id) |
||||
except: |
||||
raise Http404 |
||||
|
||||
token_generator = ContactTokenGenerator() |
||||
if token_generator.check_token(contact, token): |
||||
return contact |
||||
raise Http404 |
||||
@ -0,0 +1,42 @@ |
||||
"""VCard system for exporting Contact models""" |
||||
from datetime import datetime |
||||
|
||||
import vobject |
||||
|
||||
from django.http import HttpResponse |
||||
|
||||
|
||||
def vcard_contact_export(contact): |
||||
"""Export in VCard 3.0 a Contact model instance""" |
||||
if hasattr(contact.content_object, 'vcard_export'): |
||||
return contact.content_object.vcard_export() |
||||
|
||||
vcard = vobject.vCard() |
||||
vcard.add('n') |
||||
vcard.n.value = vobject.vcard.Name(family=contact.last_name, given=contact.first_name) |
||||
vcard.add('fn') |
||||
vcard.fn.value = '%s %s' % (contact.first_name, contact.last_name) |
||||
vcard.add('email') |
||||
vcard.email.value = contact.email |
||||
vcard.email.type_param = 'INTERNET' |
||||
return vcard.serialize() |
||||
|
||||
|
||||
def vcard_contacts_export(contacts): |
||||
"""Export multiples contacts in VCard""" |
||||
export = '' |
||||
for contact in contacts: |
||||
export += '%s\r\n' % vcard_contact_export(contact) |
||||
return export |
||||
|
||||
|
||||
def vcard_contacts_export_response(contacts, filename=''): |
||||
"""Return VCard contacts attached in a HttpResponse""" |
||||
if not filename: |
||||
filename = 'contacts_edn_%s' % datetime.now().strftime('%d-%m-%Y') |
||||
filename = filename.replace(' ', '_') |
||||
|
||||
response = HttpResponse(vcard_contacts_export(contacts), |
||||
mimetype='text/x-vcard') |
||||
response['Content-Disposition'] = 'attachment; filename=%s.vcf' % filename |
||||
return response |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue