Compare commits

..
281 changed files with 52846 additions and 57137 deletions
+15 -14
View File
@@ -80,12 +80,17 @@ lines list of objects The actual invo
for all invoice lines for all invoice lines
created before this field was introduced as well as for created before this field was introduced as well as for
all lines not created by a fee (e.g. a product). all lines not created by a fee (e.g. a product).
period_start datetime Start date of the service or delivery period of the invoice line. event_date_from datetime Start date of the (sub)event this line was created for as it
Can be ``null`` if not known. was set during invoice creation. Can be ``null`` for all invoice
├ period_end datetime End date of the service or delivery period of the invoice line. lines created before this was introduced as well as for lines in
Can be ``null`` if not known. an event series not created by a product (e.g. shipping or
├ event_date_from datetime Deprecated alias of ``period_start``. cancellation fees).
├ event_date_to datetime Deprecated alias of ``period_end``. ├ event_date_to datetime End date of the (sub)event this line was created for as it
was set during invoice creation. Can be ``null`` for all invoice
lines created before this was introduced as well as for lines in
an event series not created by a product (e.g. shipping or
cancellation fees) as well as whenever the respective (sub)event
has no end date set.
├ event_location string Location of the (sub)event this line was created for as it ├ event_location string Location of the (sub)event this line was created for as it
was set during invoice creation. Can be ``null`` for all invoice was set during invoice creation. Can be ``null`` for all invoice
lines created before this was introduced as well as for lines in lines created before this was introduced as well as for lines in
@@ -158,10 +163,10 @@ transmission_email_address string Optional. An em
Business customers only. Business customers only.
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
Peppol PEPPOL
"""""" """"""
The identifier ``"peppol"`` represents the transmission of XML invoices through the `Peppol`_ network. The identifier ``"peppol"`` represents the transmission of XML invoices through the `PEPPOL`_ network.
This is only available for business addresses. This is only available for business addresses.
This is not supported by pretix out of the box and requires the use of a suitable plugin. This is not supported by pretix out of the box and requires the use of a suitable plugin.
The ``transmission_info`` object may contain the following properties: The ``transmission_info`` object may contain the following properties:
@@ -171,7 +176,7 @@ The ``transmission_info`` object may contain the following properties:
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
Field Type Description Field Type Description
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
transmission_peppol_participant_id string Required. The Peppol participant ID of the recipient. transmission_peppol_participant_id string Required. The PEPPOL participant ID of the recipient.
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
Italian Exchange System Italian Exchange System
@@ -269,8 +274,6 @@ List of all invoices
"fee_internal_type": null, "fee_internal_type": null,
"event_date_from": "2017-12-27T10:00:00Z", "event_date_from": "2017-12-27T10:00:00Z",
"event_date_to": null, "event_date_to": null,
"period_start": "2017-12-27T10:00:00Z",
"period_end": "2017-12-27T10:00:00Z",
"event_location": "Heidelberg", "event_location": "Heidelberg",
"attendee_name": null, "attendee_name": null,
"gross_value": "23.00", "gross_value": "23.00",
@@ -417,8 +420,6 @@ Fetching individual invoices
"fee_internal_type": null, "fee_internal_type": null,
"event_date_from": "2017-12-27T10:00:00Z", "event_date_from": "2017-12-27T10:00:00Z",
"event_date_to": null, "event_date_to": null,
"period_start": "2017-12-27T10:00:00Z",
"period_end": "2017-12-27T10:00:00Z",
"event_location": "Heidelberg", "event_location": "Heidelberg",
"attendee_name": null, "attendee_name": null,
"gross_value": "23.00", "gross_value": "23.00",
@@ -604,5 +605,5 @@ but in other cases transmission may need to be triggered manually.
:statuscode 409: The invoice is currently in transmission :statuscode 409: The invoice is currently in transmission
.. _Peppol: https://en.wikipedia.org/wiki/PEPPOL .. _PEPPOL: https://en.wikipedia.org/wiki/PEPPOL
.. _Sistema di Interscambio: https://it.wikipedia.org/wiki/Fattura_elettronica_in_Italia .. _Sistema di Interscambio: https://it.wikipedia.org/wiki/Fattura_elettronica_in_Italia
-4
View File
@@ -418,7 +418,6 @@ List of all orders
"seat": null, "seat": null,
"checkins": [ "checkins": [
{ {
"id": 1337,
"list": 44, "list": 44,
"type": "entry", "type": "entry",
"gate": null, "gate": null,
@@ -663,7 +662,6 @@ Fetching individual orders
"seat": null, "seat": null,
"checkins": [ "checkins": [
{ {
"id": 1337,
"list": 44, "list": 44,
"type": "entry", "type": "entry",
"gate": null, "gate": null,
@@ -1634,7 +1632,6 @@ List of all order positions
"blocked": null, "blocked": null,
"checkins": [ "checkins": [
{ {
"id": 1337,
"list": 44, "list": 44,
"type": "entry", "type": "entry",
"gate": null, "gate": null,
@@ -1763,7 +1760,6 @@ Fetching individual positions
"seat": null, "seat": null,
"checkins": [ "checkins": [
{ {
"id": 1337,
"list": 44, "list": 44,
"type": "entry", "type": "entry",
"gate": null, "gate": null,
+2 -2
View File
@@ -23,7 +23,7 @@ There are multiple signals that will be sent out in the ordering cycle:
.. automodule:: pretix.base.signals .. automodule:: pretix.base.signals
:no-index: :no-index:
:members: validate_cart, validate_cart_addons, validate_order, order_valid_if_pending, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_expiry_changed, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, build_invoice_data, invoice_line_text :members: validate_cart, validate_cart_addons, validate_order, order_valid_if_pending, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_expiry_changed, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, invoice_line_text
Check-ins Check-ins
""""""""" """""""""
@@ -37,7 +37,7 @@ Frontend
-------- --------
.. automodule:: pretix.presale.signals .. automodule:: pretix.presale.signals
:members: html_head, html_footer, footer_link, global_footer_link, front_page_top, front_page_bottom, front_page_bottom_widget, fee_calculation_for_cart, contact_form_fields, question_form_fields, contact_form_fields_overrides, question_form_fields_overrides, checkout_confirm_messages, checkout_confirm_page_content, checkout_all_optional, html_page_header, render_seating_plan, checkout_flow_steps, position_info, position_info_top, item_description, global_html_head, global_html_footer, global_html_page_header, seatingframe_html_head, filter_subevents :members: html_head, html_footer, footer_link, global_footer_link, front_page_top, front_page_bottom, front_page_bottom_widget, fee_calculation_for_cart, contact_form_fields, question_form_fields, contact_form_fields_overrides, question_form_fields_overrides, checkout_confirm_messages, checkout_confirm_page_content, checkout_all_optional, html_page_header, render_seating_plan, checkout_flow_steps, position_info, position_info_top, item_description, global_html_head, global_html_footer, global_html_page_header, seatingframe_html_head
.. automodule:: pretix.presale.signals .. automodule:: pretix.presale.signals
+1 -1
View File
@@ -6,4 +6,4 @@ sphinxcontrib-images
sphinxcontrib-jquery sphinxcontrib-jquery
sphinxcontrib-spelling==8.* sphinxcontrib-spelling==8.*
sphinxemoji sphinxemoji
pyenchant==3.3.* pyenchant==3.2.*
+1 -1
View File
@@ -7,4 +7,4 @@ sphinxcontrib-images
sphinxcontrib-jquery sphinxcontrib-jquery
sphinxcontrib-spelling==8.* sphinxcontrib-spelling==8.*
sphinxemoji sphinxemoji
pyenchant==3.3.* pyenchant==3.2.*
+12 -12
View File
@@ -28,23 +28,23 @@ classifiers = [
dependencies = [ dependencies = [
"arabic-reshaper==3.0.0", # Support for Arabic in reportlab "arabic-reshaper==3.0.0", # Support for Arabic in reportlab
"babel", "babel",
"BeautifulSoup4==4.14.*", "BeautifulSoup4==4.13.*",
"bleach==6.2.*", "bleach==6.2.*",
"celery==5.5.*", "celery==5.5.*",
"chardet==5.2.*", "chardet==5.2.*",
"cryptography>=44.0.0", "cryptography>=44.0.0",
"css-inline==0.17.*", "css-inline==0.17.*",
"defusedcsv>=1.1.0", "defusedcsv>=1.1.0",
"Django[argon2]==4.2.*,>=4.2.24", "Django[argon2]==4.2.*,>=4.2.15",
"django-bootstrap3==25.2", "django-bootstrap3==25.2",
"django-compressor==4.5.1", "django-compressor==4.5.1",
"django-countries==7.6.*", "django-countries==7.6.*",
"django-filter==25.1", "django-filter==25.1",
"django-formset-js-improved==0.5.0.4", "django-formset-js-improved==0.5.0.3",
"django-formtools==2.5.1", "django-formtools==2.5.1",
"django-hierarkey==2.0.*,>=2.0.1", "django-hierarkey==2.0.*",
"django-hijack==3.7.*", "django-hijack==3.7.*",
"django-i18nfield==1.11.*", "django-i18nfield==1.10.*",
"django-libsass==0.9", "django-libsass==0.9",
"django-localflavor==5.0", "django-localflavor==5.0",
"django-markup", "django-markup",
@@ -64,7 +64,7 @@ dependencies = [
"kombu==5.5.*", "kombu==5.5.*",
"libsass==0.23.*", "libsass==0.23.*",
"lxml", "lxml",
"markdown==3.9", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3. "markdown==3.8.2", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7 # We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
"mt-940==4.30.*", "mt-940==4.30.*",
"oauthlib==3.3.*", "oauthlib==3.3.*",
@@ -79,7 +79,7 @@ dependencies = [
"protobuf==6.32.*", "protobuf==6.32.*",
"psycopg2-binary", "psycopg2-binary",
"pycountry", "pycountry",
"pycparser==2.23", "pycparser==2.22",
"pycryptodome==3.23.*", "pycryptodome==3.23.*",
"pypdf==6.0.*", "pypdf==6.0.*",
"python-bidi==0.6.*", # Support for Arabic in reportlab "python-bidi==0.6.*", # Support for Arabic in reportlab
@@ -90,8 +90,8 @@ dependencies = [
"qrcode==8.2", "qrcode==8.2",
"redis==6.4.*", "redis==6.4.*",
"reportlab==4.4.*", "reportlab==4.4.*",
"requests==2.32.*", "requests==2.31.*",
"sentry-sdk==2.38.*", "sentry-sdk==2.35.*",
"sepaxml==2.6.*", "sepaxml==2.6.*",
"stripe==7.9.*", "stripe==7.9.*",
"text-unidecode==1.*", "text-unidecode==1.*",
@@ -100,7 +100,7 @@ dependencies = [
"ua-parser==1.0.*", "ua-parser==1.0.*",
"vat_moss_forked==2020.3.20.0.11.0", "vat_moss_forked==2020.3.20.0.11.0",
"vobject==0.9.*", "vobject==0.9.*",
"webauthn==2.7.*", "webauthn==2.6.*",
"zeep==4.3.*" "zeep==4.3.*"
] ]
@@ -113,14 +113,14 @@ dev = [
"fakeredis==2.31.*", "fakeredis==2.31.*",
"flake8==7.3.*", "flake8==7.3.*",
"freezegun", "freezegun",
"isort==6.1.*", "isort==6.0.*",
"pep8-naming==0.15.*", "pep8-naming==0.15.*",
"potypo", "potypo",
"pytest-asyncio>=0.24", "pytest-asyncio>=0.24",
"pytest-cache", "pytest-cache",
"pytest-cov", "pytest-cov",
"pytest-django==4.*", "pytest-django==4.*",
"pytest-mock==3.15.*", "pytest-mock==3.14.*",
"pytest-sugar", "pytest-sugar",
"pytest-xdist==3.8.*", "pytest-xdist==3.8.*",
"pytest==8.4.*", "pytest==8.4.*",
+2 -2
View File
@@ -25,8 +25,8 @@ coverage:
coverage run -m py.test coverage run -m py.test
npminstall: npminstall:
# keep this in sync with pretix/_build.py! # keep this in sync with setup.py!
mkdir -p pretix/static.dist/node_prefix/ mkdir -p pretix/static.dist/node_prefix/
cp -r pretix/static/npm_dir/* pretix/static.dist/node_prefix/ cp -r pretix/static/npm_dir/* pretix/static.dist/node_prefix/
npm ci --prefix=pretix/static.dist/node_prefix npm install --prefix=pretix/static.dist/node_prefix
+1 -1
View File
@@ -19,4 +19,4 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
__version__ = "2025.9.0.dev0" __version__ = "2025.8.0.dev0"
+1 -1
View File
@@ -39,7 +39,7 @@ def npm_install():
node_prefix = os.path.join(here, 'static.dist', 'node_prefix') node_prefix = os.path.join(here, 'static.dist', 'node_prefix')
os.makedirs(node_prefix, exist_ok=True) os.makedirs(node_prefix, exist_ok=True)
shutil.copytree(os.path.join(here, 'static', 'npm_dir'), node_prefix, dirs_exist_ok=True) shutil.copytree(os.path.join(here, 'static', 'npm_dir'), node_prefix, dirs_exist_ok=True)
subprocess.check_call('npm ci', shell=True, cwd=node_prefix) subprocess.check_call('npm install', shell=True, cwd=node_prefix)
npm_installed = True npm_installed = True
-21
View File
@@ -22,7 +22,6 @@
from datetime import timedelta from datetime import timedelta
from django.db import models from django.db import models
from django.db.models import Exists, OuterRef, Q
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -112,24 +111,6 @@ class OAuthRefreshToken(AbstractRefreshToken):
) )
class WebHookQuerySet(models.QuerySet):
def for_notification(self, action_type, organizer, event):
event_listener = WebHookEventListener.objects.filter(
webhook=OuterRef('pk'),
action_type=action_type
)
webhooks = WebHook.objects.annotate(has_el=Exists(event_listener)).filter(
organizer=organizer,
has_el=True,
enabled=True
)
if event:
webhooks = webhooks.filter(
Q(all_events=True) | Q(limit_events__pk=event.pk if not isinstance(event, int) else event)
)
return webhooks
class WebHook(models.Model): class WebHook(models.Model):
organizer = models.ForeignKey('pretixbase.Organizer', on_delete=models.CASCADE, related_name='webhooks') organizer = models.ForeignKey('pretixbase.Organizer', on_delete=models.CASCADE, related_name='webhooks')
enabled = models.BooleanField(default=True, verbose_name=_("Enable webhook")) enabled = models.BooleanField(default=True, verbose_name=_("Enable webhook"))
@@ -138,8 +119,6 @@ class WebHook(models.Model):
limit_events = models.ManyToManyField('pretixbase.Event', verbose_name=_("Limit to events"), blank=True) limit_events = models.ManyToManyField('pretixbase.Event', verbose_name=_("Limit to events"), blank=True)
comment = models.CharField(verbose_name=_("Comment"), max_length=255, null=True, blank=True) comment = models.CharField(verbose_name=_("Comment"), max_length=255, null=True, blank=True)
objects = models.Manager.from_queryset(WebHookQuerySet)()
class Meta: class Meta:
ordering = ('id',) ordering = ('id',)
-1
View File
@@ -805,7 +805,6 @@ class EventSettingsSerializer(SettingsSerializer):
'invoice_reissue_after_modify', 'invoice_reissue_after_modify',
'invoice_include_free', 'invoice_include_free',
'invoice_generate', 'invoice_generate',
'invoice_period',
'invoice_numbers_consecutive', 'invoice_numbers_consecutive',
'invoice_numbers_prefix', 'invoice_numbers_prefix',
'invoice_numbers_prefix_cancellations', 'invoice_numbers_prefix_cancellations',
+2 -4
View File
@@ -1757,14 +1757,12 @@ class LinePositionField(serializers.IntegerField):
class InlineInvoiceLineSerializer(I18nAwareModelSerializer): class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
position = LinePositionField(read_only=True) position = LinePositionField(read_only=True)
event_date_from = serializers.DateTimeField(read_only=True, source="period_start")
event_date_to = serializers.DateTimeField(read_only=True, source="period_end")
class Meta: class Meta:
model = InvoiceLine model = InvoiceLine
fields = ('position', 'description', 'item', 'variation', 'subevent', 'attendee_name', 'event_date_from', fields = ('position', 'description', 'item', 'variation', 'subevent', 'attendee_name', 'event_date_from',
'event_date_to', 'period_start', 'period_end', 'gross_value', 'tax_value', 'tax_rate', 'tax_code', 'event_date_to', 'gross_value', 'tax_value', 'tax_rate', 'tax_code', 'tax_name', 'fee_type',
'tax_name', 'fee_type', 'fee_internal_type', 'event_location') 'fee_internal_type', 'event_location')
class InvoiceSerializer(I18nAwareModelSerializer): class InvoiceSerializer(I18nAwareModelSerializer):
-1
View File
@@ -484,7 +484,6 @@ class OrganizerSettingsSerializer(SettingsSerializer):
'reusable_media_type_nfc_mf0aes', 'reusable_media_type_nfc_mf0aes',
'reusable_media_type_nfc_mf0aes_autocreate_giftcard', 'reusable_media_type_nfc_mf0aes_autocreate_giftcard',
'reusable_media_type_nfc_mf0aes_autocreate_giftcard_currency', 'reusable_media_type_nfc_mf0aes_autocreate_giftcard_currency',
'reusable_media_type_nfc_mf0aes_random_uid',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
+1 -1
View File
@@ -743,7 +743,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
user=request.user if request.user.is_authenticated else None, user=request.user if request.user.is_authenticated else None,
auth=request.auth, auth=request.auth,
) )
order_placed.send(self.request.event, order=order, bulk=False) order_placed.send(self.request.event, order=order)
if order.status == Order.STATUS_PAID: if order.status == Order.STATUS_PAID:
order_paid.send(self.request.event, order=order) order_paid.send(self.request.event, order=order)
order.log_action( order.log_action(
+1 -2
View File
@@ -546,8 +546,7 @@ class DeviceViewSet(mixins.CreateModelMixin,
class OrganizerSettingsView(views.APIView): class OrganizerSettingsView(views.APIView):
permission = None permission = 'can_change_organizer_settings'
write_permission = 'can_change_organizer_settings'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer, context={ s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer, context={
+17 -3
View File
@@ -27,13 +27,16 @@ from datetime import timedelta
import requests import requests
from django.db import DatabaseError, connection, transaction from django.db import DatabaseError, connection, transaction
from django.db.models import Exists, OuterRef, Q
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.utils.translation import gettext_lazy as _, pgettext_lazy
from django_scopes import scope, scopes_disabled from django_scopes import scope, scopes_disabled
from requests import RequestException from requests import RequestException
from pretix.api.models import WebHook, WebHookCall, WebHookCallRetry from pretix.api.models import (
WebHook, WebHookCall, WebHookCallRetry, WebHookEventListener,
)
from pretix.api.signals import register_webhook_events from pretix.api.signals import register_webhook_events
from pretix.base.models import LogEntry from pretix.base.models import LogEntry
from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask
@@ -451,9 +454,20 @@ def notify_webhooks(logentry_ids: list):
_org = logentry.organizer _org = logentry.organizer
_at = logentry.action_type _at = logentry.action_type
webhooks = WebHook.objects.for_notification( # All webhooks that registered for this notification
notification_type.action_type, logentry.organizer, logentry.event_id event_listener = WebHookEventListener.objects.filter(
webhook=OuterRef('pk'),
action_type=notification_type.action_type
) )
webhooks = WebHook.objects.annotate(has_el=Exists(event_listener)).filter(
organizer=logentry.organizer,
has_el=True,
enabled=True
)
if logentry.event_id:
webhooks = webhooks.filter(
Q(all_events=True) | Q(limit_events__pk=logentry.event_id)
)
for wh in webhooks: for wh in webhooks:
send_webhook.apply_async(args=(logentry.id, notification_type.action_type, wh.pk)) send_webhook.apply_async(args=(logentry.id, notification_type.action_type, wh.pk))
+5 -19
View File
@@ -106,7 +106,7 @@ class OutboundSyncProvider:
return str(cls.identifier) return str(cls.identifier)
@classmethod @classmethod
def enqueue_order(cls, order, triggered_by, not_before=None, immediate=False): def enqueue_order(cls, order, triggered_by, not_before=None):
""" """
Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute. Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute.
@@ -119,14 +119,10 @@ class OutboundSyncProvider:
:param order: the Order that should be synced :param order: the Order that should be synced
:param triggered_by: the reason why the order should be synced, e.g. name of the signal :param triggered_by: the reason why the order should be synced, e.g. name of the signal
(currently only used internally for logging) (currently only used internally for logging)
:param immediate: whether a new sync task should run immediately for this order, instead
of waiting for the next periodic_task interval
:return: Return a tuple (queue_item, created), where created is a boolean
specifying whether a new queue item was created.
""" """
if not hasattr(cls, 'identifier'): if not hasattr(cls, 'identifier'):
raise TypeError('Call this method on a derived class that defines an "identifier" attribute.') raise TypeError('Call this method on a derived class that defines an "identifier" attribute.')
queue_item, created = OrderSyncQueue.objects.update_or_create( OrderSyncQueue.objects.update_or_create(
order=order, order=order,
sync_provider=cls.identifier, sync_provider=cls.identifier,
in_flight=False, in_flight=False,
@@ -137,10 +133,6 @@ class OutboundSyncProvider:
"need_manual_retry": None, "need_manual_retry": None,
}, },
) )
if immediate:
from pretix.base.services.datasync import sync_single
sync_single.apply_async(args=(queue_item.pk,))
return queue_item, created
@classmethod @classmethod
def get_external_link_info(cls, event, external_link_href, external_link_display_name): def get_external_link_info(cls, event, external_link_href, external_link_display_name):
@@ -260,15 +252,9 @@ class OutboundSyncProvider:
except KeyError: except KeyError:
with language(self.event.settings.locale): with language(self.event.settings.locale):
raise SyncConfigError([_( raise SyncConfigError([_(
'Field "{field_name}" does not exist. Please check your {provider_name} settings.' 'Field "{field_name}" is not valid for {available_inputs}. Please check your {provider_name} settings.'
).format(field_name=key, provider_name=self.display_name)]) ).format(key=key, available_inputs="/".join(inputs.keys()), provider_name=self.display_name)])
try: input = inputs[field.required_input]
input = inputs[field.required_input]
except KeyError:
with language(self.event.settings.locale):
raise SyncConfigError([_(
'Field "{field_name}" requires {required_input}, but only got {available_inputs}. Please check your {provider_name} settings.'
).format(field_name=key, required_input=field.required_input, available_inputs=", ".join(inputs.keys()), provider_name=self.display_name)])
val = field.getter(input) val = field.getter(input)
if isinstance(val, list): if isinstance(val, list):
if field.enum_opts and mapping_entry.get("value_map"): if field.enum_opts and mapping_entry.get("value_map"):
+1 -10
View File
@@ -22,7 +22,7 @@
from django import forms from django import forms
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.utils.translation import pgettext, pgettext_lazy from django.utils.translation import pgettext_lazy
from django_countries.fields import Country from django_countries.fields import Country
from localflavor.it.forms import ITSocialSecurityNumberField from localflavor.it.forms import ITSocialSecurityNumberField
@@ -73,12 +73,3 @@ class ItalianSdITransmissionType(TransmissionType):
if is_business: if is_business:
return base | {"company", "vat_id", "transmission_it_sdi_pec", "transmission_it_sdi_recipient_code"} return base | {"company", "vat_id", "transmission_it_sdi_pec", "transmission_it_sdi_recipient_code"}
return base | {"transmission_it_sdi_codice_fiscale"} return base | {"transmission_it_sdi_codice_fiscale"}
def pdf_info_text(self) -> str:
# Watermark is not necessary as this is a usual precaution in Italy
return pgettext(
"italian_invoice",
"This PDF document is a visual copy of the invoice and does not constitute an invoice for VAT "
"purposes. The invoice is issued in XML format, transmitted in accordance with the procedures and terms "
"set forth in No. 89757/2018 of April 30, 2018, issued by the Director of the Revenue Agency."
)
+23 -133
View File
@@ -19,9 +19,7 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import datetime
import logging import logging
import math
import re import re
import unicodedata import unicodedata
from collections import defaultdict from collections import defaultdict
@@ -225,9 +223,6 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
stylesheet.add(ParagraphStyle(name='FineprintHeading', fontName=self.font_bold, fontSize=8, leading=12)) stylesheet.add(ParagraphStyle(name='FineprintHeading', fontName=self.font_bold, fontSize=8, leading=12))
stylesheet.add(ParagraphStyle(name='Fineprint', fontName=self.font_regular, fontSize=8, leading=10)) stylesheet.add(ParagraphStyle(name='Fineprint', fontName=self.font_regular, fontSize=8, leading=10))
stylesheet.add(ParagraphStyle(name='FineprintRight', fontName=self.font_regular, fontSize=8, leading=10, alignment=TA_RIGHT)) stylesheet.add(ParagraphStyle(name='FineprintRight', fontName=self.font_regular, fontSize=8, leading=10, alignment=TA_RIGHT))
stylesheet.add(ParagraphStyle(name='WarningBlock', fontName=self.font_bold, fontSize=10, leading=12,
alignment=TA_LEFT, borderWidth=1 * mm, borderColor=colors.black,
borderPadding=2 * mm, spaceBefore=5 * mm, spaceAfter=5 * mm))
return stylesheet return stylesheet
def _register_fonts(self): def _register_fonts(self):
@@ -527,20 +522,6 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
textobject.textLine(self._normalize(self._upper(pgettext('invoice', 'Event')))) textobject.textLine(self._normalize(self._upper(pgettext('invoice', 'Event'))))
canvas.drawText(textobject) canvas.drawText(textobject)
def _date_range_in_header(self):
if self.invoice.event.has_subevents or not self.invoice.event.settings.show_dates_on_frontpage:
return None, None
tz = self.invoice.event.timezone
show_end_date = (
self.invoice.event.settings.show_date_to and
self.invoice.event.date_to and
self.invoice.event.date_to.astimezone(tz).date() != self.invoice.event.date_from.astimezone(tz).date()
)
if show_end_date:
return self.invoice.event.date_from.astimezone(tz).date(), self.invoice.event.date_to.astimezone(tz).date()
else:
return self.invoice.event.date_from.astimezone(tz).date(), None
def _draw_event(self, canvas): def _draw_event(self, canvas):
def shorten(txt): def shorten(txt):
txt = str(txt) txt = str(txt)
@@ -554,17 +535,25 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
p_size = p.wrap(self.event_width, self.event_height) p_size = p.wrap(self.event_width, self.event_height)
return txt return txt
d_from, d_to = self._date_range_in_header() if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage:
if d_from and d_to: tz = self.invoice.event.timezone
p_str = ( show_end_date = (
shorten(self.invoice.event.name) + '\n' + self.invoice.event.settings.show_date_to and
pgettext('invoice', '{from_date}\nuntil {to_date}').format( self.invoice.event.date_to and
from_date=date_format(d_from, "DATE_FORMAT"), self.invoice.event.date_to.astimezone(tz).date() != self.invoice.event.date_from.astimezone(tz).date()
to_date=date_format(d_to, "DATE_FORMAT"),
)
) )
elif d_from: if show_end_date:
p_str = shorten(self.invoice.event.name) + '\n' + date_format(d_from, "DATE_FORMAT") p_str = (
shorten(self.invoice.event.name) + '\n' +
pgettext('invoice', '{from_date}\nuntil {to_date}').format(
from_date=self.invoice.event.get_date_from_display(show_times=False),
to_date=self.invoice.event.get_date_to_display(show_times=False)
)
)
else:
p_str = (
shorten(self.invoice.event.name) + '\n' + self.invoice.event.get_date_from_display(show_times=False)
)
else: else:
p_str = shorten(self.invoice.event.name) p_str = shorten(self.invoice.event.name)
@@ -587,28 +576,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
canvas.drawRightString(self.pagesize[0] - 20 * mm, (297 - 100) * mm, self._normalize(gettext('TEST MODE'))) canvas.drawRightString(self.pagesize[0] - 20 * mm, (297 - 100) * mm, self._normalize(gettext('TEST MODE')))
canvas.restoreState() canvas.restoreState()
def _draw_watermark(self, canvas):
watermark = self.invoice.transmission_type_instance.pdf_watermark()
if watermark:
canvas.saveState()
for font_size in range(200, 20, -10):
width = stringWidth(watermark, self.font_bold, font_size)
if width < self.pagesize[0]:
break
canvas.translate(self.pagesize[0] / 2, self.pagesize[1] / 2)
canvas.rotate(math.atan(self.pagesize[1] / self.pagesize[0]) / math.pi * 180)
canvas.setFont(self.font_bold, font_size)
canvas.setFillColorRGB(.92, .92, .92)
canvas.drawCentredString(0, - font_size / 2, self._normalize(watermark))
canvas.restoreState()
def _on_first_page(self, canvas: Canvas, doc): def _on_first_page(self, canvas: Canvas, doc):
canvas.setCreator('pretix.eu') canvas.setCreator('pretix.eu')
canvas.setTitle(pgettext('invoice', 'Invoice {num}').format(num=self.invoice.number)) canvas.setTitle(pgettext('invoice', 'Invoice {num}').format(num=self.invoice.number))
canvas.saveState() canvas.saveState()
self._draw_watermark(canvas)
self._draw_footer(canvas) self._draw_footer(canvas)
self._draw_testmode(canvas) self._draw_testmode(canvas)
self._draw_invoice_from_label(canvas) self._draw_invoice_from_label(canvas)
@@ -638,14 +610,6 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
def _get_intro(self): def _get_intro(self):
story = [] story = []
type_info_text = self.invoice.transmission_type_instance.pdf_info_text()
if type_info_text:
story.append(FontFallbackParagraph(
type_info_text,
self.stylesheet['WarningBlock']
))
if self.invoice.custom_field: if self.invoice.custom_field:
story.append(FontFallbackParagraph( story.append(FontFallbackParagraph(
'{}: {}'.format( '{}: {}'.format(
@@ -692,14 +656,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
return story return story
def _get_story(self, doc): def _get_story(self, doc):
all_lines = list(self.invoice.lines.all()) has_taxes = any(il.tax_value for il in self.invoice.lines.all()) or self.invoice.reverse_charge
has_taxes = any(il.tax_value for il in all_lines) or self.invoice.reverse_charge
header_dates = self._date_range_in_header()
tz = self.invoice.event.timezone
has_multiple_service_dates = len(set(
(il.period_start, il.period_end) for il in all_lines
)) > 1
request_show_service_date = False
story = [ story = [
NextPageTemplate('FirstPage'), NextPageTemplate('FirstPage'),
@@ -743,75 +700,15 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
)] )]
def _group_key(line): def _group_key(line):
return (line.description, line.tax_rate, line.tax_name, line.net_value, line.gross_value, line.subevent, return (line.description, line.tax_rate, line.tax_name, line.net_value, line.gross_value, line.subevent_id,
line.period_start, line.period_end) line.event_date_from, line.event_date_to)
def day(dt: datetime.datetime) -> datetime.date:
if dt is None:
return None
return dt.astimezone(tz).date()
total = Decimal('0.00') total = Decimal('0.00')
for (description, tax_rate, tax_name, net_value, gross_value, subevent, period_start, period_end), lines in addon_aware_groupby( for (description, tax_rate, tax_name, net_value, gross_value, *ignored), lines in addon_aware_groupby(
all_lines, self.invoice.lines.all(),
key=_group_key, key=_group_key,
is_addon=lambda l: l.description.startswith(" +"), is_addon=lambda l: l.description.startswith(" +"),
): ):
# Try to be clever and figure out when organizers would want to show the period. This heuristic is
# not perfect and the only "fully correct" way would be to include the period on every line always,
# however this will cause confusion (a) due to useless repetition of the same date all over the invoice
# (b) due to not respecting the show_date_to setting of events in cases where we could have respected it.
# Still, we want to show the date explicitly if its different to the event or invoice date.
period_start_day = day(period_start)
period_end_day = day(period_end)
if period_start and period_end and period_end_day != period_start_day:
# It's a multi-day period, such as the validity of the ticket or an event date period
if period_start_day == header_dates[0] and period_end_day == header_dates[1]:
# This is the exact event period we already printed in the header, no need to repeat it.
period_line = ""
elif (self.event.has_subevents and subevent and day(subevent.date_from) == period_start_day and
day(subevent.date_to) == period_end_day):
# For subevents, build_invoice already includes the date in the description in the event-default format.
period_line = ""
else:
period_line = f"{date_format(period_start_day, 'SHORT_DATE_FORMAT')} {date_format(period_end_day, 'SHORT_DATE_FORMAT')}"
elif period_start or period_end:
# It's a single-day period
delivery_day = period_end_day or period_start_day
if delivery_day in header_dates:
# This is the event date we already printed in the header, no need to repeat it.
period_line = ""
elif self.event.has_subevents and subevent and delivery_day in (day(subevent.date_from), day(subevent.date_to)):
# For subevents, build_invoice already includes the date in the description in the event-default format.
period_line = ""
elif (delivery_day == self.invoice.date) and header_dates[0] is None:
# This is a shop that doesn't show the date of the event in the header, and the period is the invoice
# date. We assume that this is an 'everything is executed immediately' situation and do not want to
# confuse with showing additional dates on the invoice. This is the case that is not guaranteed to be
# correct in all cases and might need to change in the future. If customers have legal concerns, a
# quick fix is including a sentence like "Delivery date is the invoice date unless otherwise indicated:"
# in a custom text on the invoice.
period_line = ""
else:
period_line = date_format(delivery_day, 'SHORT_DATE_FORMAT')
else:
# No period known
period_line = ""
if not has_multiple_service_dates and period_line:
# Group together at the end of the invoice
request_show_service_date = period_line
elif period_line:
description += "\n" + period_line
lines = list(lines) lines = list(lines)
if has_taxes: if has_taxes:
if len(lines) > 1: if len(lines) > 1:
@@ -820,7 +717,6 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
gross_price=money_filter(gross_value, self.invoice.event.currency), gross_price=money_filter(gross_value, self.invoice.event.currency),
) )
description = description + "\n" + single_price_line description = description + "\n" + single_price_line
tdata.append(( tdata.append((
FontFallbackParagraph( FontFallbackParagraph(
self._clean_text(description, tags=['br']), self._clean_text(description, tags=['br']),
@@ -925,12 +821,6 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
story.append(Spacer(1, 10 * mm)) story.append(Spacer(1, 10 * mm))
if request_show_service_date:
story.append(FontFallbackParagraph(
self._normalize(pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date)),
self.stylesheet['Normal']
))
if self.invoice.payment_provider_text: if self.invoice.payment_provider_text:
story.append(FontFallbackParagraph( story.append(FontFallbackParagraph(
self._normalize(self.invoice.payment_provider_text), self._normalize(self.invoice.payment_provider_text),
+6 -16
View File
@@ -23,7 +23,7 @@ import re
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _, pgettext from django.utils.translation import gettext_lazy as _
from django_countries.fields import Country from django_countries.fields import Country
from pretix.base.invoicing.transmission import ( from pretix.base.invoicing.transmission import (
@@ -125,15 +125,15 @@ class PeppolIdValidator:
def __call__(self, value): def __call__(self, value):
if ":" not in value: if ":" not in value:
raise ValidationError(_("A Peppol participant ID always starts with a prefix, followed by a colon (:).")) raise ValidationError(_("A PEPPOL participant ID always starts with a prefix, followed by a colon (:)."))
prefix, second = value.split(":", 1) prefix, second = value.split(":", 1)
if prefix not in self.regex_rules: if prefix not in self.regex_rules:
raise ValidationError(_("The Peppol participant ID prefix %(number)s is not known to our system. Please " raise ValidationError(_("The PEPPOL participant ID prefix %(number)s is not known to our system. Please "
"reach out to us if you are sure this ID is correct."), params={"number": prefix}) "reach out to us if you are sure this ID is correct."), params={"number": prefix})
if not re.match(self.regex_rules[prefix], second): if not re.match(self.regex_rules[prefix], second):
raise ValidationError(_("The Peppol participant ID does not match the validation rules for the prefix " raise ValidationError(_("The PEPPOL participant ID does not match the validation rules for the prefix "
"%(number)s. Please reach out to us if you are sure this ID is correct."), "%(number)s. Please reach out to us if you are sure this ID is correct."),
params={"number": prefix}) params={"number": prefix})
return value return value
@@ -142,7 +142,7 @@ class PeppolIdValidator:
@transmission_types.new() @transmission_types.new()
class PeppolTransmissionType(TransmissionType): class PeppolTransmissionType(TransmissionType):
identifier = "peppol" identifier = "peppol"
verbose_name = "Peppol" verbose_name = "PEPPOL"
priority = 250 priority = 250
enforce_transmission = True enforce_transmission = True
@@ -153,7 +153,7 @@ class PeppolTransmissionType(TransmissionType):
def invoice_address_form_fields(self) -> dict: def invoice_address_form_fields(self) -> dict:
return { return {
"transmission_peppol_participant_id": forms.CharField( "transmission_peppol_participant_id": forms.CharField(
label=_("Peppol participant ID"), label=_("PEPPOL participant ID"),
validators=[ validators=[
PeppolIdValidator(), PeppolIdValidator(),
] ]
@@ -165,13 +165,3 @@ class PeppolTransmissionType(TransmissionType):
"company", "street", "zipcode", "city", "country", "company", "street", "zipcode", "city", "country",
} }
return base | {"transmission_peppol_participant_id"} return base | {"transmission_peppol_participant_id"}
def pdf_watermark(self) -> str:
return pgettext("peppol_invoice", "Visual copy")
def pdf_info_text(self) -> str:
return pgettext(
"peppol_invoice",
"This PDF document is a visual copy of the invoice and does not constitute an invoice for VAT "
"purposes. The original invoice is issued in XML format and transmitted through the Peppol network."
)
-12
View File
@@ -104,18 +104,6 @@ class TransmissionType:
def transmission_info_to_form_data(self, transmission_info: dict) -> dict: def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
return transmission_info return transmission_info
def pdf_watermark(self) -> Optional[str]:
"""
Return a watermark that should be rendered across the PDF file.
"""
return None
def pdf_info_text(self) -> Optional[str]:
"""
Return an info text that should be rendered on the PDF file.
"""
return None
class TransmissionProvider: class TransmissionProvider:
""" """
@@ -1,78 +0,0 @@
# Generated by Django 4.2.17 on 2025-09-08 08:14
from django.core.cache import cache
from django.db import migrations
def set_invoice_period(apps, schema_editor):
EventSettingsStore = apps.get_model("pretixbase", "Event_SettingsStore")
ev_seen = set()
insert_queue = []
flush_queue = []
def store():
EventSettingsStore.objects.bulk_create(
insert_queue,
update_conflicts=True,
update_fields=["value"],
unique_fields=["object", "key"],
)
cache.delete_many(flush_queue)
flush_queue.clear()
insert_queue.clear()
# Existing events that use pretix-zugferd and have explicitly disabled delivery dates
for setting in EventSettingsStore.objects.filter(key="zugferd_include_delivery_date", value="False"):
flush_queue.append("hierarkey_{}_{}".format("event", setting.object_id))
insert_queue.append(
EventSettingsStore(
object_id=setting.object_id,
key="invoice_period",
value="invoice_date",
)
)
ev_seen.add(setting.object_id)
if len(insert_queue) > 1000:
store()
# Existing events that previously hid their date on invoices
for setting in EventSettingsStore.objects.filter(key="show_dates_on_frontpage", value="False"):
if setting.object_id in ev_seen:
continue
flush_queue.append("hierarkey_{}_{}".format("event", setting.object_id))
insert_queue.append(
EventSettingsStore(
object_id=setting.object_id,
key="invoice_period",
value="auto_no_event",
)
)
if len(insert_queue) > 1000:
store()
store()
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0288_invoice_transmission"),
]
operations = [
migrations.RenameField(
model_name="invoiceline",
old_name="event_date_to",
new_name="period_end",
),
migrations.RenameField(
model_name="invoiceline",
old_name="event_date_from",
new_name="period_start",
),
migrations.RunPython(
set_invoice_period,
migrations.RunPython.noop,
)
]
@@ -1,18 +0,0 @@
# Generated by Django 4.2.17 on 2025-09-09 09:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0289_invoiceline_period"),
]
operations = [
migrations.AddField(
model_name="invoice",
name="plugin_data",
field=models.JSONField(default=dict),
),
]
+13 -37
View File
@@ -243,16 +243,8 @@ class EventMixin:
def waiting_list_active(self): def waiting_list_active(self):
if not self.settings.waiting_list_enabled: if not self.settings.waiting_list_enabled:
return False return False
if self.settings.waiting_list_auto_disable: if self.settings.waiting_list_auto_disable:
if self.settings.waiting_list_auto_disable.datetime(self) <= time_machine_now(): return self.settings.waiting_list_auto_disable.datetime(self) > time_machine_now()
return False
if hasattr(self, 'active_quotas'):
# Only run when called with computed quotas, i.e. event calendar
if not self.best_availability[3]:
return False
return True return True
@property @property
@@ -330,7 +322,9 @@ class EventMixin:
sq_active_item = Item.objects.using(settings.DATABASE_REPLICA).filter_available(channel=channel, voucher=voucher).filter( sq_active_item = Item.objects.using(settings.DATABASE_REPLICA).filter_available(channel=channel, voucher=voucher).filter(
Q(variations__isnull=True) Q(variations__isnull=True)
& Q(quotas__pk=OuterRef('pk')) & Q(quotas__pk=OuterRef('pk'))
) ).order_by().values_list('quotas__pk').annotate(
items=GroupConcat('pk', delimiter=',')
).values('items')
q_variation = ( q_variation = (
Q(active=True) Q(active=True)
@@ -363,7 +357,9 @@ class EventMixin:
q_variation &= Q(hide_without_voucher=False) q_variation &= Q(hide_without_voucher=False)
q_variation &= Q(item__hide_without_voucher=False) q_variation &= Q(item__hide_without_voucher=False)
sq_active_variation = ItemVariation.objects.filter(q_variation) sq_active_variation = ItemVariation.objects.filter(q_variation).order_by().values_list('quotas__pk').annotate(
items=GroupConcat('pk', delimiter=',')
).values('items')
quota_base_qs = Quota.objects.using(settings.DATABASE_REPLICA).filter( quota_base_qs = Quota.objects.using(settings.DATABASE_REPLICA).filter(
ignore_for_event_availability=False ignore_for_event_availability=False
) )
@@ -380,23 +376,8 @@ class EventMixin:
'quotas', 'quotas',
to_attr='active_quotas', to_attr='active_quotas',
queryset=quota_base_qs.annotate( queryset=quota_base_qs.annotate(
active_items=Subquery( active_items=Subquery(sq_active_item, output_field=models.TextField()),
sq_active_item.order_by().values_list('quotas__pk').annotate( active_variations=Subquery(sq_active_variation, output_field=models.TextField()),
items=GroupConcat('pk', delimiter=',')
).values('items'),
output_field=models.TextField()
),
active_variations=Subquery(
sq_active_variation.order_by().values_list('quotas__pk').annotate(
items=GroupConcat('pk', delimiter=',')
).values('items'),
output_field=models.TextField()),
has_active_items_with_waitinglist=Exists(
sq_active_item.filter(allow_waitinglist=True),
),
has_active_variations_with_waitinglist=Exists(
sq_active_variation.filter(item__allow_waitinglist=True),
),
).exclude( ).exclude(
Q(active_items="") & Q(active_variations="") Q(active_items="") & Q(active_variations="")
).select_related('event', 'subevent') ).select_related('event', 'subevent')
@@ -425,12 +406,11 @@ class EventMixin:
@cached_property @cached_property
def best_availability(self): def best_availability(self):
""" """
Returns a 4-tuple of Returns a 3-tuple of
- The availability state of this event (one of the ``Quota.AVAILABILITY_*`` constants) - The availability state of this event (one of the ``Quota.AVAILABILITY_*`` constants)
- The number of tickets currently available (or ``None``) - The number of tickets currently available (or ``None``)
- The number of tickets "originally" available (or ``None``) - The number of tickets "originally" available (or ``None``)
- Whether a sold out product has the waiting list enabled
This can only be called on objects obtained through a queryset that has been passed through ``.annotated()``. This can only be called on objects obtained through a queryset that has been passed through ``.annotated()``.
""" """
@@ -453,7 +433,6 @@ class EventMixin:
r = getattr(self, '_quota_cache', {}) r = getattr(self, '_quota_cache', {})
quotas_for_item = defaultdict(list) quotas_for_item = defaultdict(list)
quotas_for_variation = defaultdict(list) quotas_for_variation = defaultdict(list)
waiting_list_found = False
for q in self.active_quotas: for q in self.active_quotas:
if q not in r: if q not in r:
r[q] = q.availability(allow_cache=True) r[q] = q.availability(allow_cache=True)
@@ -462,8 +441,6 @@ class EventMixin:
for item_id in q.active_items.split(","): for item_id in q.active_items.split(","):
if item_id not in items_disabled: if item_id not in items_disabled:
quotas_for_item[item_id].append(q) quotas_for_item[item_id].append(q)
if q.has_active_items_with_waitinglist or q.has_active_variations_with_waitinglist:
waiting_list_found = True
if q.active_variations: if q.active_variations:
for var_id in q.active_variations.split(","): for var_id in q.active_variations.split(","):
if var_id not in vars_disabled: if var_id not in vars_disabled:
@@ -471,7 +448,7 @@ class EventMixin:
if not self.active_quotas or (not quotas_for_item and not quotas_for_variation): if not self.active_quotas or (not quotas_for_item and not quotas_for_variation):
# No item is enabled for this event, treat the event as "unknown" # No item is enabled for this event, treat the event as "unknown"
return None, None, None, waiting_list_found return None, None, None
# We iterate over all items and variations and keep track of # We iterate over all items and variations and keep track of
# - `best_state_found` - the best availability state we have seen so far. If one item is available, the event is available! # - `best_state_found` - the best availability state we have seen so far. If one item is available, the event is available!
@@ -490,7 +467,7 @@ class EventMixin:
quotas_that_are_not_unlimited = [q for q in quota_list if q.size is not None] quotas_that_are_not_unlimited = [q for q in quota_list if q.size is not None]
if not quotas_that_are_not_unlimited: if not quotas_that_are_not_unlimited:
# We found an unlimited ticket, no more need to do anything else # We found an unlimited ticket, no more need to do anything else
return Quota.AVAILABILITY_OK, None, None, waiting_list_found return Quota.AVAILABILITY_OK, None, None
if worst_state_for_ticket == Quota.AVAILABILITY_OK: if worst_state_for_ticket == Quota.AVAILABILITY_OK:
availability_of_this = min(max(0, r[q][1] - quota_used_for_found_tickets[q]) for q in quotas_that_are_not_unlimited) availability_of_this = min(max(0, r[q][1] - quota_used_for_found_tickets[q]) for q in quotas_that_are_not_unlimited)
@@ -504,8 +481,7 @@ class EventMixin:
quota_used_for_possible_tickets[q] += possible_of_this quota_used_for_possible_tickets[q] += possible_of_this
best_state_found = max(best_state_found, worst_state_for_ticket) best_state_found = max(best_state_found, worst_state_for_ticket)
return best_state_found, num_tickets_found, num_tickets_possible
return best_state_found, num_tickets_found, num_tickets_possible, waiting_list_found
def free_seats(self, ignore_voucher=None, sales_channel='web', include_blocked=False): def free_seats(self, ignore_voucher=None, sales_channel='web', include_blocked=False):
assert isinstance(sales_channel, str) or sales_channel is None assert isinstance(sales_channel, str) or sales_channel is None
+14 -15
View File
@@ -195,21 +195,20 @@ class GiftCardTransaction(models.Model):
return response return response
if self.order_id: if self.order_id:
if not customer_facing: if not self.text:
return format_html( if not customer_facing:
'<a href="{}">{}</a> {}', return format_html(
reverse( '<a href="{}">{}</a>',
"control:event.order", reverse(
kwargs={ "control:event.order",
"event": self.order.event.slug, kwargs={
"organizer": self.order.event.organizer.slug, "event": self.order.event.slug,
"code": self.order.code, "organizer": self.order.event.organizer.slug,
} "code": self.order.code,
), }
self.order.full_code, ),
self.text or "", self.order.full_code
) )
elif not self.text:
return self.order.full_code return self.order.full_code
else: else:
return self.text return self.text
+6 -57
View File
@@ -33,7 +33,6 @@
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
import string import string
import warnings
from decimal import Decimal from decimal import Decimal
import pycountry import pycountry
@@ -43,7 +42,6 @@ from django.db.models.functions import Cast
from django.utils import timezone from django.utils import timezone
from django.utils.crypto import get_random_string from django.utils.crypto import get_random_string
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext from django.utils.translation import gettext_lazy as _, pgettext
from django_scopes import ScopedManager from django_scopes import ScopedManager
@@ -202,7 +200,6 @@ class Invoice(models.Model):
transmission_info = models.JSONField(null=True, blank=True) transmission_info = models.JSONField(null=True, blank=True)
file = models.FileField(null=True, blank=True, upload_to=invoice_filename, max_length=255) file = models.FileField(null=True, blank=True, upload_to=invoice_filename, max_length=255)
plugin_data = models.JSONField(default=dict)
objects = ScopedManager(organizer='event__organizer') objects = ScopedManager(organizer='event__organizer')
@@ -371,22 +368,6 @@ class Invoice(models.Model):
from pretix.base.invoicing.transmission import transmission_types from pretix.base.invoicing.transmission import transmission_types
return transmission_types.get(identifier=self.transmission_type)[0] return transmission_types.get(identifier=self.transmission_type)[0]
def set_transmission_failed(self, provider, data):
self.transmission_status = Invoice.TRANSMISSION_STATUS_FAILED
self.transmission_date = now()
if not self.transmission_provider and provider:
self.transmission_provider = provider
self.save(update_fields=["transmission_status", "transmission_date", "transmission_provider"])
self.order.log_action(
"pretix.event.order.invoice.sending_failed",
data={
"full_invoice_no": self.full_invoice_no,
"transmission_provider": provider,
"transmission_type": self.transmission_type,
"data": data,
}
)
class InvoiceLine(models.Model): class InvoiceLine(models.Model):
""" """
@@ -406,10 +387,10 @@ class InvoiceLine(models.Model):
:type tax_name: str :type tax_name: str
:param subevent: The subevent this line refers to :param subevent: The subevent this line refers to
:type subevent: SubEvent :type subevent: SubEvent
:param period_start: Start if service period invoiced :param event_date_from: Event date of the (sub)event at the time the invoice was created
:type period_start: datetime :type event_date_from: datetime
:param period_end: End of service period invoiced :param event_date_to: Event end date of the (sub)event at the time the invoice was created
:type period_end: datetime :type event_date_to: datetime
:param event_location: Event location of the (sub)event at the time the invoice was created :param event_location: Event location of the (sub)event at the time the invoice was created
:type event_location: str :type event_location: str
:param item: The item this line refers to :param item: The item this line refers to
@@ -428,8 +409,8 @@ class InvoiceLine(models.Model):
tax_name = models.CharField(max_length=190) tax_name = models.CharField(max_length=190)
tax_code = models.CharField(max_length=190, null=True, blank=True) tax_code = models.CharField(max_length=190, null=True, blank=True)
subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT) subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT)
period_start = models.DateTimeField(null=True) event_date_from = models.DateTimeField(null=True)
period_end = models.DateTimeField(null=True) event_date_to = models.DateTimeField(null=True)
event_location = models.TextField(null=True, blank=True) event_location = models.TextField(null=True, blank=True)
item = models.ForeignKey('Item', null=True, blank=True, on_delete=models.PROTECT) item = models.ForeignKey('Item', null=True, blank=True, on_delete=models.PROTECT)
variation = models.ForeignKey('ItemVariation', null=True, blank=True, on_delete=models.PROTECT) variation = models.ForeignKey('ItemVariation', null=True, blank=True, on_delete=models.PROTECT)
@@ -446,35 +427,3 @@ class InvoiceLine(models.Model):
def __str__(self): def __str__(self):
return 'Line {} of invoice {}'.format(self.position, self.invoice) return 'Line {} of invoice {}'.format(self.position, self.invoice)
@property
def event_date_from(self):
warnings.warn(
'InvoiceLine.event_date_from is deprecated, use period_start instead,',
category=DeprecationWarning,
)
return self.period_start
@event_date_from.setter
def event_date_from(self, value):
warnings.warn(
'InvoiceLine.event_date_from is deprecated, use period_start instead,',
category=DeprecationWarning,
)
self.period_start = value
@property
def event_date_to(self):
warnings.warn(
'InvoiceLine.event_date_to is deprecated, use period_end instead,',
category=DeprecationWarning,
)
return self.period_end
@event_date_to.setter
def event_date_to(self, value):
warnings.warn(
'InvoiceLine.event_date_to is deprecated, use period_end instead,',
category=DeprecationWarning,
)
self.period_to = value
+2 -49
View File
@@ -38,11 +38,8 @@ import logging
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import connections, models from django.db import connections, models
from django.db.models import Q
from django.utils.functional import cached_property from django.utils.functional import cached_property
from pretix.api.models import WebHook
class VisibleOnlyManager(models.Manager): class VisibleOnlyManager(models.Manager):
def get_queryset(self): def get_queryset(self):
@@ -184,56 +181,12 @@ class LogEntry(models.Model):
@classmethod @classmethod
def bulk_postprocess(cls, objects): def bulk_postprocess(cls, objects):
from pretix.api.webhooks import notify_webhooks from pretix.api.webhooks import notify_webhooks
from pretix.base.models import NotificationSetting
from ..services.notifications import notify from ..services.notifications import notify
# Regular LogEntry.save() always kicks off notify and notify_webhooks tasks, regardless of whether a webhook to_notify = [o.id for o in objects if o.notification_type]
# listener exists. However, in bulk processing, it makes sense to check once and then only create the task if
# there is something to do.
_webhook_active_cache = {}
_notification_active_cache = {}
def _is_webhook_active(logentry):
nonlocal _webhook_active_cache
key = (logentry.action_type, logentry.organizer_id, logentry.event_id)
if key not in _webhook_active_cache:
notification_type = logentry.webhook_type
_webhook_active_cache[key] = notification_type and WebHook.objects.for_notification(
notification_type.action_type, logentry.organizer, logentry.event_id
).exists()
return _webhook_active_cache[key]
def _is_notification_active(logentry):
nonlocal _notification_active_cache
key = (logentry.action_type, logentry.organizer_id, logentry.event_id)
if key not in _notification_active_cache:
notification_type = logentry.notification_type
if notification_type and logentry.event:
# We only have event-related notifications right now
users = logentry.event.get_users_with_permission(
notification_type.required_permission
).filter(notifications_send=True, is_active=True)
_notification_active_cache[key] = NotificationSetting.objects.filter(
# This is not technically fully correct since it's returning True if a user has the
# notification enabled on the global level and then disabled on the per-event-level,
# but it's good enough as a first check to avoid useless celery tasks for bulk actions
Q(event_id=logentry.event_id) | Q(event__isnull=True),
action_type=notification_type.action_type,
user__pk__in=users.values_list('pk', flat=True),
enabled=True,
).exists()
else:
_webhook_active_cache[key] = False
return _notification_active_cache[key]
to_notify = [o.id for o in objects if _is_notification_active(o)]
if to_notify: if to_notify:
notify.apply_async(args=(to_notify,)) notify.apply_async(args=(to_notify,))
to_wh = [o.id for o in objects if _is_webhook_active(o)] to_wh = [o.id for o in objects if o.webhook_type]
if to_wh: if to_wh:
notify_webhooks.apply_async(args=(to_wh,)) notify_webhooks.apply_async(args=(to_wh,))
+1 -1
View File
@@ -126,7 +126,7 @@ class Organizer(LoggedModel):
self.settings.cookie_consent = True self.settings.cookie_consent = True
plugins = [p for p in settings.PRETIX_PLUGINS_ORGANIZER_DEFAULT.split(",") if p] plugins = [p for p in settings.PRETIX_PLUGINS_ORGANIZER_DEFAULT.split(",") if p]
if plugins and not self.get_plugins(): if plugins:
self.set_active_plugins(plugins, allow_restricted=plugins) self.set_active_plugins(plugins, allow_restricted=plugins)
self.save() self.save()
-1
View File
@@ -1627,7 +1627,6 @@ class GiftCardPayment(BasePaymentProvider):
order=refund.order, order=refund.order,
refund=refund, refund=refund,
acceptor=self.event.organizer, acceptor=self.event.organizer,
text=refund.comment,
) )
refund.info_data = { refund.info_data = {
'gift_card': gc.pk, 'gift_card': gc.pk,
+5 -28
View File
@@ -48,8 +48,6 @@ from functools import partial
from io import BytesIO from io import BytesIO
import jsonschema import jsonschema
import pypdf
import pypdf.generic
import reportlab.rl_config import reportlab.rl_config
from bidi import get_display from bidi import get_display
from django.conf import settings from django.conf import settings
@@ -819,7 +817,7 @@ class Renderer:
# and does not deal with our default value here properly # and does not deal with our default value here properly
content = op.secret content = op.secret
else: else:
content = self._get_text_content(op, order, o).strip() content = self._get_text_content(op, order, o)
if len(content) == 0: if len(content) == 0:
return return
@@ -1189,7 +1187,8 @@ class Renderer:
for i, page in enumerate(fg_pdf.pages): for i, page in enumerate(fg_pdf.pages):
bg_page = self.bg_pdf.pages[i] bg_page = self.bg_pdf.pages[i]
_correct_page_media_box(bg_page) if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False) page.merge_page(bg_page, over=False)
output.add_page(page) output.add_page(page)
@@ -1258,7 +1257,8 @@ def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, out_file, compress):
else: else:
for i, page in enumerate(fg_pdf.pages): for i, page in enumerate(fg_pdf.pages):
bg_page = bg_pdf.pages[i] bg_page = bg_pdf.pages[i]
_correct_page_media_box(bg_page) if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False) page.merge_page(bg_page, over=False)
# pdf_header is a string like "%pdf-X.X" # pdf_header is a string like "%pdf-X.X"
@@ -1268,29 +1268,6 @@ def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, out_file, compress):
fg_pdf.write(out_file) fg_pdf.write(out_file)
def _correct_page_media_box(page: pypdf.PageObject):
if page.rotation != 0:
page.transfer_rotation_to_content()
media_box = page.mediabox
trsf = pypdf.Transformation()
if media_box.bottom != 0:
trsf = trsf.translate(0, -media_box.bottom)
if media_box.left != 0:
trsf = trsf.translate(-media_box.left, 0)
page.add_transformation(trsf, False)
for b in ["/MediaBox", "/CropBox", "/BleedBox", "/TrimBox", "/ArtBox"]:
if b in page:
rr = pypdf.generic.RectangleObject(page[b])
pt1 = trsf.apply_on(rr.lower_left)
pt2 = trsf.apply_on(rr.upper_right)
page[pypdf.generic.NameObject(b)] = pypdf.generic.RectangleObject((
min(pt1[0], pt2[0]),
min(pt1[1], pt2[1]),
max(pt1[0], pt2[0]),
max(pt1[1], pt2[1]),
))
@deconstructible @deconstructible
class PdfLayoutValidator: class PdfLayoutValidator:
def __call__(self, value): def __call__(self, value):
+39 -99
View File
@@ -61,9 +61,7 @@ from pretix.base.models.tax import EU_CURRENCIES
from pretix.base.services.tasks import ( from pretix.base.services.tasks import (
TransactionAwareProfiledEventTask, TransactionAwareTask, TransactionAwareProfiledEventTask, TransactionAwareTask,
) )
from pretix.base.signals import ( from pretix.base.signals import invoice_line_text, periodic_task
build_invoice_data, invoice_line_text, periodic_task,
)
from pretix.celery_app import app from pretix.celery_app import app
from pretix.helpers.database import OF_SELF, rolledback_transaction from pretix.helpers.database import OF_SELF, rolledback_transaction
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
@@ -84,10 +82,6 @@ def build_invoice(invoice: Invoice) -> Invoice:
lp = invoice.order.payments.last() lp = invoice.order.payments.last()
min_period_start = None
max_period_end = None
now_dt = now()
with (language(invoice.locale, invoice.event.settings.region)): with (language(invoice.locale, invoice.event.settings.region)):
invoice.invoice_from = invoice.event.settings.get('invoice_address_from') invoice.invoice_from = invoice.event.settings.get('invoice_address_from')
invoice.invoice_from_name = invoice.event.settings.get('invoice_address_from_name') invoice.invoice_from_name = invoice.event.settings.get('invoice_address_from_name')
@@ -214,9 +208,7 @@ def build_invoice(invoice: Invoice) -> Invoice:
positions = list( positions = list(
invoice.order.positions.select_related('addon_to', 'item', 'tax_rule', 'subevent', 'variation').annotate( invoice.order.positions.select_related('addon_to', 'item', 'tax_rule', 'subevent', 'variation').annotate(
addon_c=Count('addons') addon_c=Count('addons')
).prefetch_related( ).prefetch_related('answers', 'answers__options', 'answers__question').order_by('positionid', 'id')
'answers', 'answers__options', 'answers__question', 'granted_memberships',
).order_by('positionid', 'id')
) )
reverse_charge = False reverse_charge = False
@@ -275,10 +267,6 @@ def build_invoice(invoice: Invoice) -> Invoice:
location=_location_oneliner(location) location=_location_oneliner(location)
) )
period_start, period_end = _service_period_for_position(invoice, p, now_dt)
min_period_start = min(min_period_start or period_start, period_start)
max_period_end = min(max_period_end or period_end, period_end)
InvoiceLine.objects.create( InvoiceLine.objects.create(
position=i, position=i,
invoice=invoice, invoice=invoice,
@@ -289,8 +277,8 @@ def build_invoice(invoice: Invoice) -> Invoice:
item=p.item, item=p.item,
variation=p.variation, variation=p.variation,
attendee_name=p.attendee_name if invoice.event.settings.invoice_attendee_name else None, attendee_name=p.attendee_name if invoice.event.settings.invoice_attendee_name else None,
period_start=period_start, event_date_from=p.subevent.date_from if invoice.event.has_subevents else invoice.event.date_from,
period_end=period_end, event_date_to=p.subevent.date_to if invoice.event.has_subevents else invoice.event.date_to,
event_location=location if invoice.event.settings.invoice_event_location else None, event_location=location if invoice.event.settings.invoice_event_location else None,
tax_rate=p.tax_rate, tax_rate=p.tax_rate,
tax_code=p.tax_code, tax_code=p.tax_code,
@@ -313,29 +301,13 @@ def build_invoice(invoice: Invoice) -> Invoice:
fee_title = _(fee.get_fee_type_display()) fee_title = _(fee.get_fee_type_display())
if fee.description: if fee.description:
fee_title += " - " + fee.description fee_title += " - " + fee.description
if min_period_start and max_period_end:
# Consider fees to have the same service period as the products sold
period_start = min_period_start
period_end = max_period_end
else:
# Usually can only happen if everything except a cancellation fee is removed
if invoice.event.settings.invoice_period in ("auto", "auto_no_event", "event_date") and not invoice.event.has_subevents:
# Non-series event, let's be backwards-compatible and tag everything with the event period
period_start = invoice.event.date_from
period_end = invoice.event.date_to
else:
# We could try to work from the canceled positions, but it doesn't really make sense. A cancellation
# fee is not "delivered" at the event date, it is rather effective right now.
period_start = period_end = now()
InvoiceLine.objects.create( InvoiceLine.objects.create(
position=i + offset, position=i + offset,
invoice=invoice, invoice=invoice,
description=fee_title, description=fee_title,
gross_value=fee.value, gross_value=fee.value,
period_start=period_start, event_date_from=None if invoice.event.has_subevents else invoice.event.date_from,
period_end=period_end, event_date_to=None if invoice.event.has_subevents else invoice.event.date_to,
event_location=( event_location=(
None if invoice.event.has_subevents None if invoice.event.has_subevents
else (str(invoice.event.location) else (str(invoice.event.location)
@@ -364,7 +336,6 @@ def build_invoice(invoice: Invoice) -> Invoice:
invoice.reverse_charge = reverse_charge invoice.reverse_charge = reverse_charge
invoice.save() invoice.save()
build_invoice_data.send(sender=invoice.event, invoice=invoice)
return invoice return invoice
@@ -380,55 +351,6 @@ def build_cancellation(invoice: Invoice):
return invoice return invoice
def _service_period_for_position(invoice, position, invoice_dt):
if invoice.event.settings.invoice_period in ("auto", "auto_no_event"):
if position.valid_from and position.valid_until:
period_start = position.valid_from
period_end = position.valid_until
elif position.valid_from:
period_start = position.valid_from
period_end = position.valid_from # weird, but we have nothing else to base this on
elif position.valid_until:
period_start = min(invoice.order.datetime, position.valid_until)
period_end = position.valid_until
elif memberships := list(position.granted_memberships.all()):
period_start = min(m.date_start for m in memberships)
period_end = max(m.date_end for m in memberships)
elif invoice.event.has_subevents:
if position.subevent:
period_start = position.subevent.date_from
period_end = position.subevent.date_to
else:
# Currently impossible case, but might not be in the future and never makes
# sense to use the event date here
period_start = invoice_dt
period_end = invoice_dt
elif invoice.event.settings.invoice_period == "auto_no_event":
period_start = invoice_dt
period_end = invoice_dt
else:
period_start = invoice.event.date_from
period_end = invoice.event.date_to
elif invoice.event.settings.invoice_period == "order_date":
period_start = invoice.order.datetime
period_end = invoice.order.datetime
elif invoice.event.settings.invoice_period == "event_date":
if position.subevent:
period_start = position.subevent.date_from
period_end = position.subevent.date_to
else:
period_start = invoice.event.date_from
period_end = invoice.event.date_to
elif invoice.event.settings.invoice_period == "invoice_date":
period_start = period_end = invoice_dt
else:
raise ValueError(f"Invalid invoice period setting '{invoice.event.settings.invoice_period}'")
if not period_end:
period_end = period_start
return period_start, period_end
def generate_cancellation(invoice: Invoice, trigger_pdf=True): def generate_cancellation(invoice: Invoice, trigger_pdf=True):
if invoice.canceled: if invoice.canceled:
raise ValueError("Invoice should not be canceled twice.") raise ValueError("Invoice should not be canceled twice.")
@@ -534,12 +456,6 @@ def build_preview_invoice_pdf(event):
if not locale or locale == '__user__': if not locale or locale == '__user__':
locale = event.settings.locale locale = event.settings.locale
if event.settings.invoice_period in ("auto", "auto_no_event", "event_date"):
period_start = event.date_from
period_end = event.date_to or event.date_from
else:
period_start = period_end = timezone.now()
with rolledback_transaction(), language(locale, event.settings.region): with rolledback_transaction(), language(locale, event.settings.region):
order = event.orders.create( order = event.orders.create(
status=Order.STATUS_PENDING, datetime=timezone.now(), status=Order.STATUS_PENDING, datetime=timezone.now(),
@@ -590,8 +506,8 @@ def build_preview_invoice_pdf(event):
invoice=invoice, description=_("Sample product {}").format(i + 1), invoice=invoice, description=_("Sample product {}").format(i + 1),
gross_value=tax.gross, tax_value=tax.tax, gross_value=tax.gross, tax_value=tax.tax,
tax_rate=tax.rate, tax_name=tax.name, tax_code=tax.code, tax_rate=tax.rate, tax_name=tax.name, tax_code=tax.code,
period_start=period_start, event_date_from=event.date_from,
period_end=period_end, event_date_to=event.date_to,
event_location=event.settings.invoice_event_location, event_location=event.settings.invoice_event_location,
) )
else: else:
@@ -599,8 +515,8 @@ def build_preview_invoice_pdf(event):
InvoiceLine.objects.create( InvoiceLine.objects.create(
invoice=invoice, description=_("Sample product A"), invoice=invoice, description=_("Sample product A"),
gross_value=100, tax_value=0, tax_rate=0, tax_code=None, gross_value=100, tax_value=0, tax_rate=0, tax_code=None,
period_start=period_start, event_date_from=event.date_from,
period_end=period_end, event_date_to=event.date_to,
event_location=event.settings.invoice_event_location, event_location=event.settings.invoice_event_location,
) )
@@ -748,7 +664,20 @@ def transmit_invoice(sender, invoice_id, allow_retransmission=True, **kwargs):
break break
if not provider: if not provider:
invoice.set_transmission_failed(provider=None, data={"reason": "no_provider"}) invoice.transmission_status = Invoice.TRANSMISSION_STATUS_FAILED
invoice.transmission_date = now()
invoice.save(update_fields=["transmission_status", "transmission_date"])
invoice.order.log_action(
"pretix.event.order.invoice.sending_failed",
data={
"full_invoice_no": invoice.full_invoice_no,
"transmission_provider": None,
"transmission_type": invoice.transmission_type,
"data": {
"reason": "no_provider",
},
}
)
return return
if invoice.order.testmode and not provider.testmode_supported: if invoice.order.testmode and not provider.testmode_supported:
@@ -769,7 +698,18 @@ def transmit_invoice(sender, invoice_id, allow_retransmission=True, **kwargs):
provider.transmit(invoice) provider.transmit(invoice)
except Exception as e: except Exception as e:
logger.exception(f"Transmission of invoice {invoice.pk} failed with exception.") logger.exception(f"Transmission of invoice {invoice.pk} failed with exception.")
invoice.set_transmission_failed(provider=provider.identifier, data={ invoice.transmission_status = Invoice.TRANSMISSION_STATUS_FAILED
"reason": "exception", invoice.transmission_date = now()
"exception": str(e), invoice.save(update_fields=["transmission_status", "transmission_date"])
}) invoice.order.log_action(
"pretix.event.order.invoice.sending_failed",
data={
"full_invoice_no": invoice.full_invoice_no,
"transmission_provider": None,
"transmission_type": invoice.transmission_type,
"data": {
"reason": "exception",
"exception": str(e),
},
}
)
+52 -88
View File
@@ -405,12 +405,8 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
attach_cid_images(html_message, cid_images, verify_ssl=True) attach_cid_images(html_message, cid_images, verify_ssl=True)
email.attach_alternative(html_message, "multipart/related") email.attach_alternative(html_message, "multipart/related")
log_target = None
if user: if user:
user = User.objects.get(pk=user) user = User.objects.get(pk=user)
error_log_action_type = 'pretix.user.email.error'
log_target = user
if event: if event:
with scopes_disabled(): with scopes_disabled():
@@ -430,15 +426,12 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
with cm(): with cm():
if customer: if customer:
customer = Customer.objects.get(pk=customer) customer = Customer.objects.get(pk=customer)
if not user: log_target = user or customer
error_log_action_type = 'pretix.customer.email.error'
log_target = customer
if event: if event:
if order: if order:
try: try:
order = event.orders.get(pk=order) order = event.orders.get(pk=order)
error_log_action_type = 'pretix.event.order.email.error'
log_target = order log_target = order
except Order.DoesNotExist: except Order.DoesNotExist:
order = None order = None
@@ -495,7 +488,7 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
email = email_filter.send_chained(event, 'message', message=email, order=order, user=user) email = email_filter.send_chained(event, 'message', message=email, order=order, user=user)
invoices_to_mark_transmitted = [] invoices_sent = []
if invoices: if invoices:
invoices = Invoice.objects.filter(pk__in=invoices) invoices = Invoice.objects.filter(pk__in=invoices)
for inv in invoices: for inv in invoices:
@@ -516,23 +509,7 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
inv.file.file.read(), inv.file.file.read(),
'application/pdf' 'application/pdf'
) )
invoices_sent.append(inv)
if inv.transmission_type == "email":
# Mark invoice as sent when it was sent to the requested address *either* at the time of
# invoice creation *or* as of right now.
expected_recipients = [
(inv.invoice_to_transmission_info or {}).get("transmission_email_address")
or inv.order.email,
]
try:
expected_recipients.append(
(inv.order.invoice_address.transmission_info or {}).get("transmission_email_address")
or inv.order.email
)
except InvoiceAddress.DoesNotExist:
pass
if any(t in expected_recipients for t in to):
invoices_to_mark_transmitted.append(inv)
except: except:
logger.exception('Could not attach invoice to email') logger.exception('Could not attach invoice to email')
pass pass
@@ -597,7 +574,7 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
except MaxRetriesExceededError: except MaxRetriesExceededError:
if log_target: if log_target:
log_target.log_action( log_target.log_action(
error_log_action_type, 'pretix.email.error',
data={ data={
'subject': 'SMTP code {}, max retries exceeded'.format(e.smtp_code), 'subject': 'SMTP code {}, max retries exceeded'.format(e.smtp_code),
'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error), 'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error),
@@ -605,17 +582,12 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
'invoices': [], 'invoices': [],
} }
) )
for i in invoices_to_mark_transmitted:
i.set_transmission_failed(provider="email_pdf", data={
"reason": "exception",
"exception": "SMTP code {}, max retries exceeded".format(e.smtp_code),
})
raise e raise e
logger.exception('Error sending email') logger.exception('Error sending email')
if log_target: if log_target:
log_target.log_action( log_target.log_action(
error_log_action_type, 'pretix.email.error',
data={ data={
'subject': 'SMTP code {}'.format(e.smtp_code), 'subject': 'SMTP code {}'.format(e.smtp_code),
'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error), 'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error),
@@ -623,11 +595,6 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
'invoices': [], 'invoices': [],
} }
) )
for i in invoices_to_mark_transmitted:
i.set_transmission_failed(provider="email_pdf", data={
"reason": "exception",
"exception": "SMTP code {}".format(e.smtp_code),
})
raise SendMailException('Failed to send an email to {}.'.format(to)) raise SendMailException('Failed to send an email to {}.'.format(to))
except smtplib.SMTPRecipientsRefused as e: except smtplib.SMTPRecipientsRefused as e:
@@ -651,7 +618,7 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
message.append(f'{e}: {val[0]} {val[1].decode()}') message.append(f'{e}: {val[0]} {val[1].decode()}')
log_target.log_action( log_target.log_action(
error_log_action_type, 'pretix.email.error',
data={ data={
'subject': 'SMTP error', 'subject': 'SMTP error',
'message': '\n'.join(message), 'message': '\n'.join(message),
@@ -659,11 +626,6 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
'invoices': [], 'invoices': [],
} }
) )
for i in invoices_to_mark_transmitted:
i.set_transmission_failed(provider="email_pdf", data={
"reason": "exception",
"exception": "SMTP error",
})
raise SendMailException('Failed to send an email to {}.'.format(to)) raise SendMailException('Failed to send an email to {}.'.format(to))
except Exception as e: except Exception as e:
@@ -673,7 +635,7 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
except MaxRetriesExceededError: except MaxRetriesExceededError:
if log_target: if log_target:
log_target.log_action( log_target.log_action(
error_log_action_type, 'pretix.email.error',
data={ data={
'subject': 'Internal error', 'subject': 'Internal error',
'message': f'Max retries exceeded after error "{str(e)}"', 'message': f'Max retries exceeded after error "{str(e)}"',
@@ -681,15 +643,10 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
'invoices': [], 'invoices': [],
} }
) )
for i in invoices_to_mark_transmitted:
i.set_transmission_failed(provider="email_pdf", data={
"reason": "exception",
"exception": "Internal error",
})
raise e raise e
if log_target: if log_target:
log_target.log_action( log_target.log_action(
error_log_action_type, 'pretix.email.error',
data={ data={
'subject': 'Internal error', 'subject': 'Internal error',
'message': str(e), 'message': str(e),
@@ -697,52 +654,59 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
'invoices': [], 'invoices': [],
} }
) )
for i in invoices_to_mark_transmitted:
i.set_transmission_failed(provider="email_pdf", data={
"reason": "exception",
"exception": "Internal error",
})
logger.exception('Error sending email') logger.exception('Error sending email')
raise SendMailException('Failed to send an email to {}.'.format(to)) raise SendMailException('Failed to send an email to {}.'.format(to))
else: else:
for i in invoices_to_mark_transmitted: for i in invoices_sent:
if i.transmission_status != Invoice.TRANSMISSION_STATUS_COMPLETED: if i.transmission_type == "email":
i.transmission_date = now() # Mark invoice as sent when it was sent to the requested address *either* at the time of invoice
i.transmission_status = Invoice.TRANSMISSION_STATUS_COMPLETED # creation *or* as of right now.
i.transmission_provider = "email_pdf" expected_recipients = [
i.transmission_info = { (i.invoice_to_transmission_info or {}).get("transmission_email_address") or i.order.email,
"sent": [ ]
try:
expected_recipients.append((i.order.invoice_address.transmission_info or {}).get("transmission_email_address") or i.order.email)
except InvoiceAddress.DoesNotExist:
pass
if not any(t in expected_recipients for t in to):
continue
if i.transmission_status != Invoice.TRANSMISSION_STATUS_COMPLETED:
i.transmission_date = now()
i.transmission_status = Invoice.TRANSMISSION_STATUS_COMPLETED
i.transmission_provider = "email_pdf"
i.transmission_info = {
"sent": [
{
"recipients": to,
"datetime": now().isoformat(),
}
]
}
i.save(update_fields=[
"transmission_date", "transmission_provider", "transmission_status",
"transmission_info"
])
elif i.transmission_provider == "email_pdf":
i.transmission_info["sent"].append(
{ {
"recipients": to, "recipients": to,
"datetime": now().isoformat(), "datetime": now().isoformat(),
} }
] )
} i.save(update_fields=[
i.save(update_fields=[ "transmission_info"
"transmission_date", "transmission_provider", "transmission_status", ])
"transmission_info" i.order.log_action(
]) "pretix.event.order.invoice.sent",
elif i.transmission_provider == "email_pdf": data={
i.transmission_info["sent"].append( "full_invoice_no": i.full_invoice_no,
{ "transmission_provider": "email_pdf",
"recipients": to, "transmission_type": "email",
"datetime": now().isoformat(), "data": {
"recipients": [to],
},
} }
) )
i.save(update_fields=[
"transmission_info"
])
i.order.log_action(
"pretix.event.order.invoice.sent",
data={
"full_invoice_no": i.full_invoice_no,
"transmission_provider": "email_pdf",
"transmission_type": "email",
"data": {
"recipients": [to],
},
}
)
def mail_send(*args, **kwargs): def mail_send(*args, **kwargs):
+1 -1
View File
@@ -221,7 +221,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user,
for o in orders: for o in orders:
with language(o.locale, event.settings.region): with language(o.locale, event.settings.region):
order_placed.send(event, order=o, bulk=True) order_placed.send(event, order=o)
if o.status == Order.STATUS_PAID: if o.status == Order.STATUS_PAID:
order_paid.send(event, order=o) order_paid.send(event, order=o)
+1 -1
View File
@@ -1091,7 +1091,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no
for msg in meta_info.get('confirm_messages', []): for msg in meta_info.get('confirm_messages', []):
order.log_action('pretix.event.order.consent', data={'msg': msg}) order.log_action('pretix.event.order.consent', data={'msg': msg})
order_placed.send(event, order=order, bulk=False) order_placed.send(event, order=order)
return order, payments return order, payments
-1
View File
@@ -197,7 +197,6 @@ def order_overview(
item.all_variations = list(item.variations.all()) item.all_variations = list(item.variations.all())
item.has_variations = (len(item.all_variations) > 0) item.has_variations = (len(item.all_variations) > 0)
item.num = {} item.num = {}
item.subevent = subevent
if item.has_variations: if item.has_variations:
for var in item.all_variations: for var in item.all_variations:
variid = var.id variid = var.id
+3 -4
View File
@@ -69,6 +69,9 @@ def generate_order(order: int, provider: str):
prov = response(order.event) prov = response(order.event)
if prov.identifier == provider: if prov.identifier == provider:
filename, ttype, data = prov.generate_order(order) filename, ttype, data = prov.generate_order(order)
if ttype == 'text/uri-list':
continue
path, ext = os.path.splitext(filename) path, ext = os.path.splitext(filename)
for ct in CachedCombinedTicket.objects.filter(order=order, provider=provider): for ct in CachedCombinedTicket.objects.filter(order=order, provider=provider):
ct.delete() ct.delete()
@@ -158,10 +161,6 @@ def get_tickets_for_order(order, base_position=None):
if not retval: if not retval:
continue continue
ct = CachedCombinedTicket.objects.get(pk=retval) ct = CachedCombinedTicket.objects.get(pk=retval)
if ct.type == 'text/uri-list':
continue
tickets.append(( tickets.append((
"{}-{}-{}{}".format( "{}-{}-{}{}".format(
order.event.slug.upper(), order.code, ct.provider, ct.extension, order.event.slug.upper(), order.code, ct.provider, ct.extension,
-29
View File
@@ -1098,35 +1098,6 @@ DEFAULTS = {
help_text=_("Invoices will never be automatically generated for free orders.") help_text=_("Invoices will never be automatically generated for free orders.")
) )
}, },
'invoice_period': {
'default': 'auto',
'type': str,
'form_class': forms.ChoiceField,
'serializer_class': serializers.ChoiceField,
'serializer_kwargs': dict(
choices=(
('auto', _('Automatic based on ticket-specific validity, membership validity, event series date, or event date')),
('auto_no_event', _('Automatic, but prefer invoice date over event date')),
('event_date', _('Event date')),
('order_date', _('Order date')),
('invoice_date', _('Invoice date')),
),
),
'form_kwargs': dict(
label=_("Date of service"),
widget=forms.RadioSelect,
choices=(
('auto', _('Automatic based on ticket-specific validity, membership validity, event series date, or event date')),
('auto_no_event', _('Automatic, but prefer invoice date over event date')),
('event_date', _('Event date')),
('order_date', _('Order date')),
('invoice_date', _('Invoice date')),
),
help_text=_("This controls what dates are shown on the invoice, but is especially important for "
"electronic invoicing."),
required=True,
)
},
'invoice_reissue_after_modify': { 'invoice_reissue_after_modify': {
'default': 'False', 'default': 'False',
'type': bool, 'type': bool,
+12 -25
View File
@@ -99,24 +99,24 @@ def is_app_active(sender, app, allow_legacy_plugins=False):
elif isinstance(sender, Organizer) and allow_legacy_plugins: elif isinstance(sender, Organizer) and allow_legacy_plugins:
# Deprecated behaviour: Event plugins that are registered on organizer level are considered active for # Deprecated behaviour: Event plugins that are registered on organizer level are considered active for
# all organizers in the context of signals that used to be global signals before the introduction of # all organizers in the context of signals that used to be global signals before the introduction of
# organizer plugins. A deprecation warning is emitted at .connect() time. # organizer-level plugin. A deprecation warning is emitted at .connect() time.
enabled = True enabled = True
else: else:
raise ImproperlyConfigured(f"Cannot check if event plugin is active on {type(sender)}") raise ImproperlyConfigured(f"Cannot check if event-level plugin is active on {type(sender)}")
elif level == PLUGIN_LEVEL_ORGANIZER: elif level == PLUGIN_LEVEL_ORGANIZER:
if isinstance(sender, Organizer): if isinstance(sender, Organizer):
enabled = app.name in sender.get_plugins() enabled = app.name in sender.get_plugins()
elif isinstance(sender, Event): elif isinstance(sender, Event):
enabled = app.name in sender.organizer.get_plugins() enabled = app.name in sender.organizer.get_plugins()
else: else:
raise ImproperlyConfigured(f"Cannot check if organizer plugin is active on {type(sender)}") raise ImproperlyConfigured(f"Cannot check if organizer-level plugin is active on {type(sender)}")
elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID: elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID:
if isinstance(sender, Organizer): if isinstance(sender, Organizer):
enabled = app.name in sender.get_plugins() enabled = app.name in sender.get_plugins()
elif isinstance(sender, Event): elif isinstance(sender, Event):
enabled = app.name in sender.get_plugins() and app.name in sender.organizer.get_plugins() enabled = app.name in sender.get_plugins() and app.name in sender.organizer.get_plugins()
else: else:
raise ImproperlyConfigured(f"Cannot check if hybrid event/organizer plugin is active on {type(sender)}") raise ImproperlyConfigured(f"Cannot check if hybrid event/organizer-level plugin is active on {type(sender)}")
else: else:
raise ImproperlyConfigured("Unknown plugin level") raise ImproperlyConfigured("Unknown plugin level")
@@ -230,7 +230,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
class EventPluginSignal(PluginSignal[Event]): class EventPluginSignal(PluginSignal[Event]):
""" """
This is an extension to Django's built-in signals which differs in a way that it sends This is an extension to Django's built-in signals which differs in a way that it sends
out its events only to receivers which belong to plugins that are enabled for the given out it's events only to receivers which belong to plugins that are enabled for the given
Event. Event.
""" """
type = Event type = Event
@@ -254,7 +254,7 @@ class EventPluginSignal(PluginSignal[Event]):
class OrganizerPluginSignal(PluginSignal[Organizer]): class OrganizerPluginSignal(PluginSignal[Organizer]):
""" """
This is an extension to Django's built-in signals which differs in a way that it sends This is an extension to Django's built-in signals which differs in a way that it sends
out its events only to receivers which belong to plugins that are enabled for the given out it's events only to receivers which belong to plugins that are enabled for the given
Organizer. Organizer.
""" """
type = Organizer type = Organizer
@@ -596,18 +596,6 @@ multiple events. Receivers should return a subclass of pretix.base.exporter.Base
The ``sender`` keyword argument will contain an organizer. The ``sender`` keyword argument will contain an organizer.
""" """
build_invoice_data = EventPluginSignal()
"""
Arguments: ``invoice``
This signal is sent out every time an invoice is built, after the invoice model was created
and filled and before the PDF generation task is started. You can use this to make changes
to the invoice, but we recommend to mostly use it to add content to ``Invoice.plugin_data``.
You are responsible for saving any changes to the database.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
validate_order = EventPluginSignal() validate_order = EventPluginSignal()
""" """
Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``, Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``,
@@ -665,13 +653,12 @@ As with all event-plugin signals, the ``sender`` keyword argument will contain t
order_placed = EventPluginSignal() order_placed = EventPluginSignal()
""" """
Arguments: ``order``, ``bulk`` Arguments: ``order``
This signal is sent out every time an order is placed. The order object is given This signal is sent out every time an order is placed. The order object is given
as the first argument. The ``bulk`` argument specifies whether the order was placed as the first argument. This signal is *not* sent out if an order is created through
as part of a bulk action, e.g. an import from a file. splitting an existing order, so you can not expect to see all orders by listening
This signal is *not* sent out if an order is created through splitting an existing order, to this signal.
so you can not expect to see all orders by listening to this signal.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event. As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
""" """
@@ -911,7 +898,7 @@ This signals allows you to add fees to an order while it is being created. You a
return a list of ``OrderFee`` objects that are not yet saved to the database return a list of ``OrderFee`` objects that are not yet saved to the database
(because there is no order yet). (because there is no order yet).
As with all event plugin signals, the ``sender`` keyword argument will contain the event. A ``positions`` As with all plugin signals, the ``sender`` keyword argument will contain the event. A ``positions``
argument will contain the cart positions and ``invoice_address`` the invoice address (useful for argument will contain the cart positions and ``invoice_address`` the invoice address (useful for
tax calculation). The argument ``meta_info`` contains the order's meta dictionary. The ``total`` tax calculation). The argument ``meta_info`` contains the order's meta dictionary. The ``total``
keyword argument will contain the total cart sum without any fees. You should not rely on this keyword argument will contain the total cart sum without any fees. You should not rely on this
@@ -929,7 +916,7 @@ This signals allows you to return a human-readable description for a fee type ba
and ``internal_type`` attributes of the ``OrderFee`` model that you get as keyword arguments. You are and ``internal_type`` attributes of the ``OrderFee`` model that you get as keyword arguments. You are
expected to return a string or None, if you don't know about this fee. expected to return a string or None, if you don't know about this fee.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
allow_ticket_download = EventPluginSignal() allow_ticket_download = EventPluginSignal()
-1
View File
@@ -857,7 +857,6 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm):
'invoice_show_payments', 'invoice_show_payments',
'invoice_reissue_after_modify', 'invoice_reissue_after_modify',
'invoice_generate', 'invoice_generate',
'invoice_period',
'invoice_attendee_name', 'invoice_attendee_name',
'invoice_event_location', 'invoice_event_location',
'invoice_include_expire_date', 'invoice_include_expire_date',
+5 -36
View File
@@ -107,16 +107,11 @@ def get_all_payment_providers():
return Event return Event
with rolledback_transaction(): with rolledback_transaction():
plugins = ",".join([app.name for app in apps.get_app_configs()])
organizer = Organizer.objects.create(
name="INTERNAL",
plugins=plugins,
)
event = Event.objects.create( event = Event.objects.create(
plugins=plugins, plugins=",".join([app.name for app in apps.get_app_configs()]),
name="INTERNAL", name="INTERNAL",
date_from=now(), date_from=now(),
organizer=organizer, organizer=Organizer.objects.create(name="INTERNAL")
) )
event = FakeEvent(event) event = FakeEvent(event)
provs = register_payment_providers.send( provs = register_payment_providers.send(
@@ -225,7 +220,6 @@ class OrderFilterForm(FilterForm):
(_('Cancellations'), ( (_('Cancellations'), (
(Order.STATUS_CANCELED, _('Canceled (fully)')), (Order.STATUS_CANCELED, _('Canceled (fully)')),
('cp', _('Canceled (fully or with paid fee)')), ('cp', _('Canceled (fully or with paid fee)')),
('cany', _('Canceled (at least one position)')),
('rc', _('Cancellation requested')), ('rc', _('Cancellation requested')),
('cni', _('Fully canceled but invoice not canceled')), ('cni', _('Fully canceled but invoice not canceled')),
)), )),
@@ -402,16 +396,6 @@ class OrderFilterForm(FilterForm):
).filter( ).filter(
Q(status=Order.STATUS_PAID, has_pc=False) | Q(status=Order.STATUS_CANCELED) Q(status=Order.STATUS_PAID, has_pc=False) | Q(status=Order.STATUS_CANCELED)
) )
elif s == 'cany':
s = OrderPosition.all.filter(
order=OuterRef('pk'),
canceled=True,
)
qs = qs.annotate(
has_pc_c=Exists(s)
).filter(
Q(has_pc_c=True) | Q(status=Order.STATUS_CANCELED)
)
if fdata.get('ordering'): if fdata.get('ordering'):
qs = qs.order_by(*get_deterministic_ordering(Order, self.get_order_by())) qs = qs.order_by(*get_deterministic_ordering(Order, self.get_order_by()))
@@ -490,31 +474,16 @@ class EventOrderFilterForm(OrderFilterForm):
fdata = self.cleaned_data fdata = self.cleaned_data
qs = super().filter_qs(qs) qs = super().filter_qs(qs)
# This is a little magic, but there's no option that does not confuse people and let's hope this confuses less
# people.
only_match_noncanceled_products = fdata.get('status') in (
Order.STATUS_PAID,
Order.STATUS_PAID + 'v',
Order.STATUS_PENDING,
Order.STATUS_PENDING + Order.STATUS_PAID,
)
if only_match_noncanceled_products:
canceled_filter = Q(all_positions__canceled=False)
elif fdata.get('status') in ('cp', 'cany'):
canceled_filter = Q(all_positions__canceled=True) | Q(status=Order.STATUS_CANCELED)
else:
canceled_filter = Q()
item = fdata.get('item') item = fdata.get('item')
if item: if item:
if '-' in item: if '-' in item:
var = item.split('-')[1] var = item.split('-')[1]
qs = qs.filter(canceled_filter, all_positions__variation_id=var).distinct() qs = qs.filter(all_positions__variation_id=var, all_positions__canceled=False).distinct()
else: else:
qs = qs.filter(canceled_filter, all_positions__item_id=fdata.get('item')).distinct() qs = qs.filter(all_positions__item_id=fdata.get('item'), all_positions__canceled=False).distinct()
if fdata.get('subevent'): if fdata.get('subevent'):
qs = qs.filter(canceled_filter, all_positions__subevent=fdata.get('subevent')).distinct() qs = qs.filter(all_positions__subevent=fdata.get('subevent'), all_positions__canceled=False).distinct()
if fdata.get('question') and fdata.get('answer') is not None: if fdata.get('question') and fdata.get('answer') is not None:
q = fdata.get('question') q = fdata.get('question')
+1 -2
View File
@@ -67,8 +67,7 @@ class RRuleForm(forms.Form):
) )
count = forms.IntegerField( count = forms.IntegerField(
label=_('Number of repetitions'), label=_('Number of repetitions'),
initial=10, initial=10
min_value=1,
) )
until = forms.DateField( until = forms.DateField(
widget=forms.DateInput( widget=forms.DateInput(
+1 -1
View File
@@ -236,7 +236,7 @@ class VoucherForm(I18nModelForm):
try: try:
Voucher.clean_max_usages(data, self.instance.redeemed) Voucher.clean_max_usages(data, self.instance.redeemed)
except ValidationError as e: except ValidationError as e:
raise ValidationError({"max_usages": e}) raise ValidationError({"max_usages": e.message})
check_quota = Voucher.clean_quota_needs_checking( check_quota = Voucher.clean_quota_needs_checking(
data, self.initial_instance_data, data, self.initial_instance_data,
item_changed=data.get('itemvar') != self.initial.get('itemvar'), item_changed=data.get('itemvar') != self.initial.get('itemvar'),
+1 -3
View File
@@ -581,7 +581,7 @@ class CoreOrderLogEntryType(OrderLogEntryType):
'The voucher has been set to expire because the recipient removed themselves from the waiting list.'), 'The voucher has been set to expire because the recipient removed themselves from the waiting list.'),
'pretix.voucher.changed': _('The voucher has been changed.'), 'pretix.voucher.changed': _('The voucher has been changed.'),
'pretix.voucher.deleted': _('The voucher has been deleted.'), 'pretix.voucher.deleted': _('The voucher has been deleted.'),
'pretix.voucher.added.waitinglist': _('The voucher has been assigned to {email} through the waiting list.'), 'pretix.voucher.added.waitinglist': _('The voucher has been sent to {email} through the waiting list.'),
}) })
class CoreVoucherLogEntryType(VoucherLogEntryType): class CoreVoucherLogEntryType(VoucherLogEntryType):
pass pass
@@ -719,7 +719,6 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
'pretix.customer.anonymized': _('The account has been disabled and anonymized.'), 'pretix.customer.anonymized': _('The account has been disabled and anonymized.'),
'pretix.customer.password.resetrequested': _('A new password has been requested.'), 'pretix.customer.password.resetrequested': _('A new password has been requested.'),
'pretix.customer.password.set': _('A new password has been set.'), 'pretix.customer.password.set': _('A new password has been set.'),
'pretix.customer.email.error': _('Sending of an email has failed.'),
'pretix.reusable_medium.created': _('The reusable medium has been created.'), 'pretix.reusable_medium.created': _('The reusable medium has been created.'),
'pretix.reusable_medium.created.auto': _('The reusable medium has been created automatically.'), 'pretix.reusable_medium.created.auto': _('The reusable medium has been created automatically.'),
'pretix.reusable_medium.changed': _('The reusable medium has been changed.'), 'pretix.reusable_medium.changed': _('The reusable medium has been changed.'),
@@ -753,7 +752,6 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
'pretix.user.anonymized': _('This user has been anonymized.'), 'pretix.user.anonymized': _('This user has been anonymized.'),
'pretix.user.oauth.authorized': _('The application "{application_name}" has been authorized to access your ' 'pretix.user.oauth.authorized': _('The application "{application_name}" has been authorized to access your '
'account.'), 'account.'),
'pretix.user.email.error': _('Sending of an email has failed.'),
'pretix.control.auth.user.forgot_password.mail_sent': _('Password reset mail sent.'), 'pretix.control.auth.user.forgot_password.mail_sent': _('Password reset mail sent.'),
'pretix.control.auth.user.forgot_password.recovered': _('The password has been reset.'), 'pretix.control.auth.user.forgot_password.recovered': _('The password has been reset.'),
'pretix.control.auth.user.forgot_password.denied.repeated': _('A repeated password reset has been denied, as ' 'pretix.control.auth.user.forgot_password.denied.repeated': _('A repeated password reset has been denied, as '
+21 -31
View File
@@ -52,7 +52,7 @@ This signal allows you to put code inside the HTML ``<head>`` tag
of every page in the backend. You will get the request as the keyword argument of every page in the backend. You will get the request as the keyword argument
``request`` and are expected to return plain HTML. ``request`` and are expected to return plain HTML.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
nav_event = EventPluginSignal() nav_event = EventPluginSignal()
@@ -77,7 +77,7 @@ The latter method also allows you to register navigation items as a sub-item of
If you use this, you should read the documentation on :ref:`how to deal with URLs <urlconf>` If you use this, you should read the documentation on :ref:`how to deal with URLs <urlconf>`
in pretix. in pretix.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
nav_topbar = GlobalSignal() nav_topbar = GlobalSignal()
@@ -131,7 +131,7 @@ Arguments: 'request'
This signal is sent out to include custom HTML in the top part of the the event dashboard. This signal is sent out to include custom HTML in the top part of the the event dashboard.
Receivers should return HTML. Receivers should return HTML.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
An additional keyword argument ``subevent`` *can* contain a sub-event. An additional keyword argument ``subevent`` *can* contain a sub-event.
""" """
@@ -146,7 +146,7 @@ should return a list of dictionaries, where each dictionary can have the keys:
* priority (int, used for ordering, higher comes first, default is 1) * priority (int, used for ordering, higher comes first, default is 1)
* url (str, optional, if the full widget should be a link) * url (str, optional, if the full widget should be a link)
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
An additional keyword argument ``subevent`` *can* contain a sub-event. An additional keyword argument ``subevent`` *can* contain a sub-event.
""" """
@@ -173,7 +173,7 @@ Arguments: 'form'
This signal allows you to add additional HTML to the form that is used for modifying vouchers. This signal allows you to add additional HTML to the form that is used for modifying vouchers.
You receive the form object in the ``form`` keyword argument. You receive the form object in the ``form`` keyword argument.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
voucher_form_class = EventPluginSignal() voucher_form_class = EventPluginSignal()
@@ -189,7 +189,7 @@ an asynchronous context. For the bulk creation form, ``save()`` is not called. I
you can implement ``post_bulk_save(saved_vouchers)`` which may be called multiple times you can implement ``post_bulk_save(saved_vouchers)`` which may be called multiple times
for every batch persisted to the database. for every batch persisted to the database.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
voucher_form_validation = EventPluginSignal() voucher_form_validation = EventPluginSignal()
@@ -200,7 +200,7 @@ This signal allows you to add additional validation to the form that is used for
creating and modifying vouchers. You will receive the form instance in the ``form`` creating and modifying vouchers. You will receive the form instance in the ``form``
argument and the current data state in the ``data`` argument. argument and the current data state in the ``data`` argument.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
quota_detail_html = EventPluginSignal() quota_detail_html = EventPluginSignal()
@@ -210,7 +210,7 @@ Arguments: 'quota'
This signal allows you to append HTML to a Quota's detail view. You receive the This signal allows you to append HTML to a Quota's detail view. You receive the
quota as argument in the ``quota`` keyword argument. quota as argument in the ``quota`` keyword argument.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
organizer_edit_tabs = DeprecatedSignal() organizer_edit_tabs = DeprecatedSignal()
@@ -241,14 +241,8 @@ If your linked view should stay in the tab-like context of this page, we recomme
that you use ``pretix.control.views.organizer.OrganizerDetailViewMixin`` for your view that you use ``pretix.control.views.organizer.OrganizerDetailViewMixin`` for your view
and your template inherits from ``pretixcontrol/organizers/base.html``. and your template inherits from ``pretixcontrol/organizers/base.html``.
This is an organizer plugin signal (not an event-level signal). Organizer and This is a regular django signal (no pretix event signal). Receivers will be passed
hybrid plugins, will receive it if they're active for the current organizer. the keyword arguments ``organizer`` and ``request``.
**Deprecation Notice:** Currently, event plugins can always receive this signal,
regardless of activation. In the future, event plugins will not be allowed to register
to organizer-level signals.
Receivers will be passed the keyword arguments ``organizer`` and ``request``.
""" """
order_info = EventPluginSignal() order_info = EventPluginSignal()
@@ -257,7 +251,7 @@ Arguments: ``order``, ``request``
This signal is sent out to display additional information on the order detail page This signal is sent out to display additional information on the order detail page
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
Additionally, the argument ``order`` and ``request`` are available. Additionally, the argument ``order`` and ``request`` are available.
""" """
@@ -267,7 +261,7 @@ Arguments: ``order``, ``position``, ``request``
This signal is sent out to display additional buttons for a single position of an order. This signal is sent out to display additional buttons for a single position of an order.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
Additionally, the argument ``order`` and ``request`` are available. Additionally, the argument ``order`` and ``request`` are available.
""" """
@@ -285,7 +279,7 @@ If your linked view should stay in the tab-like context of this page, we recomme
that you use ``pretix.control.views.event.EventSettingsViewMixin`` for your view that you use ``pretix.control.views.event.EventSettingsViewMixin`` for your view
and your template inherits from ``pretixcontrol/event/settings_base.html``. and your template inherits from ``pretixcontrol/event/settings_base.html``.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
A second keyword argument ``request`` will contain the request object. A second keyword argument ``request`` will contain the request object.
""" """
@@ -296,7 +290,7 @@ Arguments: 'request'
This signal is sent out to include template snippets on the settings page of an event This signal is sent out to include template snippets on the settings page of an event
that allows generating a pretix Widget code. that allows generating a pretix Widget code.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
A second keyword argument ``request`` will contain the request object. A second keyword argument ``request`` will contain the request object.
""" """
@@ -310,15 +304,11 @@ an instance of a form class that you bind yourself when appropriate. Your form w
as part of the standard validation and rendering cycle and rendered using default bootstrap as part of the standard validation and rendering cycle and rendered using default bootstrap
styles. It is advisable to set a prefix for your form to avoid clashes with other plugins. styles. It is advisable to set a prefix for your form to avoid clashes with other plugins.
Your forms may also have special properties: Your forms may also have two special properties: ``template`` with a template that will be
included to render the form, and ``title``, which will be used as a headline. Your template
will be passed a ``form`` variable with your form.
- ``template`` with a template that will be included to render the form. Your template will be passed a ``form`` As with all plugin signals, the ``sender`` keyword argument will contain the event.
variable with your form.
- ``title``, which will be used as a headline.
- ``ìs_layouts = True``, if your form should be grouped with the ticket layout settings (mutually exclusive with setting ``title``).
- ``group_with_formset = True``, if your form should be grouped with a formset of the same ``title``
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
""" """
item_formsets = EventPluginSignal() item_formsets = EventPluginSignal()
@@ -336,7 +326,7 @@ Your formset needs to have two special properties: ``template`` with a template
included to render the formset and ``title`` that will be used as a headline. Your template included to render the formset and ``title`` that will be used as a headline. Your template
will be passed a ``formset`` variable with your formset. will be passed a ``formset`` variable with your formset.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
subevent_forms = EventPluginSignal() subevent_forms = EventPluginSignal()
@@ -357,7 +347,7 @@ Your forms may also have two special properties: ``template`` with a template th
included to render the form, and ``title``, which will be used as a headline. Your template included to render the form, and ``title``, which will be used as a headline. Your template
will be passed a ``form`` variable with your form. will be passed a ``form`` variable with your form.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
oauth_application_registered = GlobalSignal() oauth_application_registered = GlobalSignal()
@@ -391,5 +381,5 @@ You are required to set ``prefix`` on your form instance. You are required to im
method on your form that returns a new, filtered query set. You are required to implement a ``filter_to_strings()`` method on your form that returns a new, filtered query set. You are required to implement a ``filter_to_strings()``
method on your form that returns a list of strings describing the currently active filters. method on your form that returns a list of strings describing the currently active filters.
As with all event plugin signals, the ``sender`` keyword argument will contain the event. As with all plugin signals, the ``sender`` keyword argument will contain the event.
""" """
@@ -15,19 +15,6 @@
{% bootstrap_field form.invoice_email_attachment layout="control" %} {% bootstrap_field form.invoice_email_attachment layout="control" %}
{% bootstrap_field form.invoice_email_organizer layout="control" %} {% bootstrap_field form.invoice_email_organizer layout="control" %}
{% bootstrap_field form.invoice_language layout="control" %} {% bootstrap_field form.invoice_language layout="control" %}
{% bootstrap_field form.invoice_period layout="control" %}
{% if not request.event.settings.show_dates_on_frontpage %}
<div data-display-dependency="input[name=invoice_period][value=auto],input[name=invoice_period][value=event_date]">
<div class="alert alert-warning dynamic">
{% blocktrans trimmed %}
You configured that your shop is not an event and the event date should not be shown.
Therefore, we recommend that you set the date of service to a different option.
{% endblocktrans %}
</div>
</div>
{% endif %}
{% bootstrap_field form.invoice_include_free layout="control" %} {% bootstrap_field form.invoice_include_free layout="control" %}
{% bootstrap_field form.invoice_show_payments layout="control" %} {% bootstrap_field form.invoice_show_payments layout="control" %}
{% bootstrap_field form.invoice_reissue_after_modify layout="control" %} {% bootstrap_field form.invoice_reissue_after_modify layout="control" %}
@@ -177,18 +177,6 @@
{% for v in formsets.values %} {% for v in formsets.values %}
<fieldset> <fieldset>
<legend>{{ v.title }}</legend> <legend>{{ v.title }}</legend>
{% for f in plugin_forms %}
{% if f.group_with_formset and f.title == v.title %}
{% if f.template and not "template" in f.fields %}
{% include f.template with form=f %}
{% else %}
{% bootstrap_form f layout="control" %}
{% endif %}
<hr />
{% endif %}
{% endfor %}
{% include v.template with formset=v %} {% include v.template with formset=v %}
</fieldset> </fieldset>
{% endfor %} {% endfor %}
@@ -288,7 +276,7 @@
{% endfor %} {% endfor %}
</fieldset> </fieldset>
{% for f in plugin_forms %} {% for f in plugin_forms %}
{% if not f.is_layouts and not f.group_with_formset and f.title %} {% if not f.is_layouts and f.title %}
<fieldset> <fieldset>
<legend>{{ f.title }}</legend> <legend>{{ f.title }}</legend>
{% if f.template and not "template" in f.fields %} {% if f.template and not "template" in f.fields %}
@@ -74,7 +74,7 @@
<thead> <thead>
<tr> <tr>
<th>{% trans "Product" %}</th> <th>{% trans "Product" %}</th>
<th>{% trans "Canceled" %}</th> <th>{% trans "Canceled" %}¹</th>
<th>{% trans "Expired" %}</th> <th>{% trans "Expired" %}</th>
<th>{% trans "Approval pending" %}</th> <th>{% trans "Approval pending" %}</th>
<th colspan="3" class="text-center">{% trans "Purchased" %}</th> <th colspan="3" class="text-center">{% trans "Purchased" %}</th>
@@ -106,27 +106,27 @@
<tr class="item {% if tup.0 %}categorized{% endif %}"> <tr class="item {% if tup.0 %}categorized{% endif %}">
<td>{{ item }}</td> <td>{{ item }}</td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}&amp;status=cany&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}&amp;status=c&amp;provider={{ item.provider }}">
{{ item.num.canceled|togglesum:request.event.currency }} {{ item.num.canceled|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}&amp;status=e&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}&amp;status=e&amp;provider={{ item.provider }}">
{{ item.num.expired|togglesum:request.event.currency }} {{ item.num.expired|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}&amp;status=pa&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}&amp;status=pa&amp;provider={{ item.provider }}">
{{ item.num.unapproved|togglesum:request.event.currency }} {{ item.num.unapproved|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}&amp;status=na&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}&amp;status=na&amp;provider={{ item.provider }}">
{{ item.num.pending|togglesum:request.event.currency }} {{ item.num.pending|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}&amp;status=p&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}&amp;status=p&amp;provider={{ item.provider }}">
{{ item.num.paid|togglesum:request.event.currency }} {{ item.num.paid|togglesum:request.event.currency }}
</a> </a>
</td> </td>
@@ -139,27 +139,27 @@
<tr class="variation {% if tup.0 %}categorized{% endif %}"> <tr class="variation {% if tup.0 %}categorized{% endif %}">
<td>{{ var }}</td> <td>{{ var }}</td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=cany&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=c&amp;provider={{ item.provider }}">
{{ var.num.canceled|togglesum:request.event.currency }} {{ var.num.canceled|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=e&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=e&amp;provider={{ item.provider }}">
{{ var.num.expired|togglesum:request.event.currency }} {{ var.num.expired|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=pa&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=pa&amp;provider={{ item.provider }}">
{{ var.num.unapproved|togglesum:request.event.currency }} {{ var.num.unapproved|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=na&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=na&amp;provider={{ item.provider }}">
{{ var.num.pending|togglesum:request.event.currency }} {{ var.num.pending|togglesum:request.event.currency }}
</a> </a>
</td> </td>
<td> <td>
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=p&amp;provider={{ item.provider }}{% if subevent %}&amp;subevent={{ subevent.pk }}{% endif %}"> <a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&amp;status=p&amp;provider={{ item.provider }}">
{{ var.num.paid|togglesum:request.event.currency }} {{ var.num.paid|togglesum:request.event.currency }}
</a> </a>
</td> </td>
@@ -185,4 +185,7 @@
</tfoot> </tfoot>
</table> </table>
</div> </div>
<p class="help-block">
¹ {% trans "If you click links in this column, you will only find orders that are canceled completely, while the numbers also include single canceled positions within valid orders." %}
</p>
{% endblock %} {% endblock %}
@@ -69,36 +69,34 @@
{% if show_meta %} {% if show_meta %}
<span class="text-muted text-sm">{{ plugin.version }}</span> <span class="text-muted text-sm">{{ plugin.version }}</span>
{% endif %} {% endif %}
{% if is_active or plugin.level == "event" %} {% if is_active and level == "organizer" %}
{% if plugin.level == "organizer" %} <span class="label label-success" data-is-active>
<span class="label label-success" data-is-active> <span class="fa fa-check" aria-hidden="true"></span>
<span class="fa fa-check" aria-hidden="true"></span> {% trans "Active" %}
{% trans "Active" %} </span>
</span> {% elif events_counter == events_total %}
{% elif events_total and events_counter == events_total %} <span class="label label-success" data-is-active>
<span class="label label-success" data-is-active> <span class="fa fa-check" aria-hidden="true"></span>
<span class="fa fa-check" aria-hidden="true"></span> {% trans "Active (all events)" %}
{% trans "Active (all events)" %} </span>
</span> {% elif events_counter %}
{% elif events_counter %} <span class="label label-info" data-is-active>
<span class="label label-info" data-is-active> <span class="fa fa-check" aria-hidden="true"></span>
<span class="fa fa-check" aria-hidden="true"></span> {% blocktrans trimmed count count=events_counter %}
{% blocktrans trimmed count count=events_counter %} Active ({{ count }} event)
Active ({{ count }} event) {% plural %}
{% plural %} Active ({{ count }} events)
Active ({{ count }} events) {% endblocktrans %}
{% endblocktrans %} </span>
</span> {% elif level == "event_organizer" %}
{% elif level == "event_organizer" %} <span class="label label-info" data-is-active>
<span class="label label-info" data-is-active> <span class="fa fa-check" aria-hidden="true"></span>
<span class="fa fa-check" aria-hidden="true"></span> {% blocktrans trimmed count count=0 %}
{% blocktrans trimmed count count=0 %} Active ({{ count }} event)
Active ({{ count }} event) {% plural %}
{% plural %} Active ({{ count }} events)
Active ({{ count }} events) {% endblocktrans %}
{% endblocktrans %} </span>
</span>
{% endif %}
{% endif %} {% endif %}
</h4> </h4>
{% include "pretixcontrol/event/fragment_plugin_description.html" with plugin=plugin %} {% include "pretixcontrol/event/fragment_plugin_description.html" with plugin=plugin %}
@@ -238,7 +238,7 @@
<div class="row control-group pdf-info"> <div class="row control-group pdf-info">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="pdf-info-name">{% trans "Layout name" %}</label><br> <label for="pdf-info-name">{% trans "Layout name" %}</label><br>
<input type="text" id="pdf-info-name" class="input-block-level form-control" name="name" value="{{ name }}" maxlength="190"> <input type="text" id="pdf-info-name" class="input-block-level form-control" name="name" value="{{ name }}">
</div> </div>
</div> </div>
{% endif %} {% endif %}
+17 -25
View File
@@ -82,35 +82,27 @@ class ControlSyncJob(OrderView):
messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.')) messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.'))
elif self.request.POST.get("cancel_job"): elif self.request.POST.get("cancel_job"):
with transaction.atomic(): with transaction.atomic():
try: job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get( pk=self.request.POST.get("cancel_job")
pk=self.request.POST.get("cancel_job") )
) if job.in_flight:
except OrderSyncQueue.DoesNotExist: messages.warning(self.request, _('The sync job is already in progress.'))
messages.info(self.request, _('The sync job could not be found. It may have been processed in the meantime.'))
else: else:
if job.in_flight: job.delete()
messages.warning(self.request, _('The sync job is already in progress.')) messages.success(self.request, _('The sync job has been canceled.'))
else:
job.delete()
messages.success(self.request, _('The sync job has been canceled.'))
elif self.request.POST.get("run_job_now"): elif self.request.POST.get("run_job_now"):
with transaction.atomic(): with transaction.atomic():
try: job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get( pk=self.request.POST.get("run_job_now")
pk=self.request.POST.get("run_job_now") )
) if job.in_flight:
except OrderSyncQueue.DoesNotExist: messages.success(self.request, _('The sync job is already in progress.'))
messages.info(self.request, _('The sync job could not be found. It may have been processed in the meantime.'))
else: else:
if job.in_flight: job.not_before = now()
messages.success(self.request, _('The sync job is already in progress.')) job.need_manual_retry = None
else: job.save()
job.not_before = now() sync_single.apply_async(args=(job.pk,))
job.need_manual_retry = None messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
job.save()
sync_single.apply_async(args=(job.pk,))
messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
return redirect(self.get_order_url()) return redirect(self.get_order_url())
+1 -12
View File
@@ -110,18 +110,7 @@ class MessageView(TemplateView):
class LogDetailView(AdministratorPermissionRequiredMixin, View): class LogDetailView(AdministratorPermissionRequiredMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
le = get_object_or_404(LogEntry, pk=request.GET.get('pk')) le = get_object_or_404(LogEntry, pk=request.GET.get('pk'))
try: return JsonResponse({'action_type': le.action_type, 'content_type': str(le.content_type), 'object_id': le.object_id, 'data': le.parsed_data})
object_repr = repr(le.content_object)
except Exception as e:
object_repr = 'Error: ' + str(e)
return JsonResponse({
'datetime': le.datetime.isoformat(),
'action_type': le.action_type,
'content_type': str(le.content_type),
'object_id': le.object_id,
'object_repr': object_repr,
'data': le.parsed_data,
})
class PaymentDetailView(AdministratorPermissionRequiredMixin, View): class PaymentDetailView(AdministratorPermissionRequiredMixin, View):
+7 -28
View File
@@ -711,15 +711,11 @@ class OrderDownload(AsyncAction, OrderView):
) )
return resp return resp
elif isinstance(value, CachedCombinedTicket): elif isinstance(value, CachedCombinedTicket):
if value.type == 'text/uri-list': resp = FileResponse(value.file.file, content_type=value.type)
resp = HttpResponseRedirect(value.file.file.read()) resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
return resp self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
else: )
resp = FileResponse(value.file.file, content_type=value.type) return resp
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
)
return resp
else: else:
return redirect(self.get_self_url()) return redirect(self.get_self_url())
@@ -2579,11 +2575,6 @@ class OverView(EventPermissionRequiredMixin, TemplateView):
self.request.event, self.request.event,
fees=True fees=True
) )
ctx['subevent'] = (
self.request.event.has_subevents and
self.filter_form.is_valid() and
self.filter_form.cleaned_data.get('subevent')
)
ctx['subevent_warning'] = ( ctx['subevent_warning'] = (
self.request.event.has_subevents and self.request.event.has_subevents and
self.filter_form.is_valid() and self.filter_form.is_valid() and
@@ -2836,23 +2827,11 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
def get_queryset(self): def get_queryset(self):
return self.get_scheduled_queryset() return self.get_scheduled_queryset()
def has_permission(self):
return self.request.user.has_event_permission(self.request.organizer, self.request.event, "can_view_orders")
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
if "schedule" in self.request.POST or self.scheduled: if "schedule" in self.request.POST or self.scheduled:
if "schedule" in self.request.POST and not self.has_permission(): ctx['schedule_form'] = self.schedule_form
messages.error( ctx['rrule_form'] = self.rrule_form
self.request,
_(
"Your user account does not have sufficient permission to run this report, therefore "
"you cannot schedule it."
)
)
else:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
elif not self.exporter: elif not self.exporter:
for s in ctx['scheduled']: for s in ctx['scheduled']:
try: try:
+5 -20
View File
@@ -638,10 +638,12 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
active_counter = Counter() active_counter = Counter()
events_total = 0 events_total = 0
org_plugins = self.object.get_plugins()
for e in self.object.events.only("plugins").iterator(): for e in self.object.events.only("plugins").iterator():
events_total += 1 events_total += 1
for p in e.get_plugins(): for p in e.get_plugins():
active_counter[p] += 1 if p in org_plugins:
active_counter[p] += 1
plugins_grouped = groupby( plugins_grouped = groupby(
sorted( sorted(
plugins, plugins,
@@ -2189,28 +2191,11 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView):
def get_queryset(self): def get_queryset(self):
return self.get_scheduled_queryset() return self.get_scheduled_queryset()
def has_permission(self):
if isinstance(self.exporter, OrganizerLevelExportMixin):
if not self.request.user.has_organizer_permission(self.request.organizer, self.exporter.organizer_required_permission):
return False
if self.exporter and not self.exporter.available_for_user(self.request.user):
return False
return True
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
if "schedule" in self.request.POST or self.scheduled: if "schedule" in self.request.POST or self.scheduled:
if "schedule" in self.request.POST and not self.has_permission(): ctx['schedule_form'] = self.schedule_form
messages.error( ctx['rrule_form'] = self.rrule_form
self.request,
_(
"Your user account does not have sufficient permission to run this report, therefore "
"you cannot schedule it."
)
)
else:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
elif not self.exporter: elif not self.exporter:
for s in ctx['scheduled']: for s in ctx['scheduled']:
try: try:
+9 -26
View File
@@ -174,38 +174,21 @@ class SubEventDelete(EventPermissionRequiredMixin, CompatDeleteView):
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
@transaction.atomic
def delete(self, request, *args, **kwargs): def delete(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
success_url = self.get_success_url() success_url = self.get_success_url()
try: if not self.object.allow_delete():
with transaction.atomic(): messages.error(request, pgettext_lazy('subevent', 'A date can not be deleted if orders already have been '
if not self.object.allow_delete(): 'placed.'))
messages.error(request, pgettext_lazy('subevent', 'A date can not be deleted if orders already have been ' return HttpResponseRedirect(self.get_success_url())
'placed.'))
return HttpResponseRedirect(success_url)
self.object.log_action('pretix.subevent.deleted', user=self.request.user)
CartPosition.objects.filter(addon_to__subevent=self.object).delete()
self.object.cartposition_set.all().delete()
self.object.delete()
except ProtectedError:
if self.object.active:
with transaction.atomic():
self.object.log_action(
'pretix.subevent.changed', user=self.request.user, data={
'active': False
},
)
self.object.active = False
self.object.save(update_fields=['active'])
messages.error(self.request, pgettext_lazy(
'subevent',
'The date could not be deleted as some constraints (e.g. data created by plug-ins) did not allow '
'it. The date was disabled instead.'
))
else: else:
self.object.log_action('pretix.subevent.deleted', user=self.request.user)
CartPosition.objects.filter(addon_to__subevent=self.object).delete()
self.object.cartposition_set.all().delete()
self.object.delete()
messages.success(request, pgettext_lazy('subevent', 'The selected date has been deleted.')) messages.success(request, pgettext_lazy('subevent', 'The selected date has been deleted.'))
return HttpResponseRedirect(success_url) return HttpResponseRedirect(success_url)
def get_success_url(self) -> str: def get_success_url(self) -> str:
+2 -2
View File
@@ -710,9 +710,9 @@ class UserNotificationsEditView(TemplateView):
messages.success(request, _('Your notification settings have been saved.')) messages.success(request, _('Your notification settings have been saved.'))
if request.user.notifications_send: if request.user.notifications_send:
self.request.user.log_action('pretix.user.settings.notifications.enabled', user=self.request.user)
else:
self.request.user.log_action('pretix.user.settings.notifications.disabled', user=self.request.user) self.request.user.log_action('pretix.user.settings.notifications.disabled', user=self.request.user)
else:
self.request.user.log_action('pretix.user.settings.notifications.enabled', user=self.request.user)
return redirect( return redirect(
reverse('control:user.settings.notifications') + reverse('control:user.settings.notifications') +
('?event={}'.format(self.event.pk) if self.event else '') ('?event={}'.format(self.event.pk) if self.event else '')
+4 -12
View File
@@ -34,7 +34,9 @@
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import get_language, pgettext_lazy from django.utils.translation import (
get_language, gettext_lazy as _, pgettext_lazy,
)
from pretix.helpers.templatetags.date_fast import date_fast as _date from pretix.helpers.templatetags.date_fast import date_fast as _date
@@ -64,16 +66,6 @@ def daterange(df, dt, as_html=False):
return format_html(base_format, _date(df, "j."), mark_safe(until.strip()), _date(dt, "j. F Y")) return format_html(base_format, _date(df, "j."), mark_safe(until.strip()), _date(dt, "j. F Y"))
elif df.year == dt.year: elif df.year == dt.year:
return format_html(base_format, _date(df, "j. F"), until, _date(dt, "j. F Y")) return format_html(base_format, _date(df, "j. F"), until, _date(dt, "j. F Y"))
elif lng == "en-nz":
if df.year == dt.year and df.month == dt.month and df.day == dt.day:
# Mon, 15 January 2024
return format_html(base_format, _date(df, "D, j F Y"))
elif df.year == dt.year and df.month == dt.month:
# 1 3 January 2024
return format_html(base_format, _date(df, "j"), until, _date(dt, "j F Y"))
elif df.year == dt.year:
# 1 January 3 April 2024
return format_html(base_format, _date(df, "j F"), until, _date(dt, "j F Y"))
elif lng.startswith("en"): elif lng.startswith("en"):
if df.year == dt.year and df.month == dt.month and df.day == dt.day: if df.year == dt.year and df.month == dt.month and df.day == dt.day:
return format_html(base_format, _date(df, "D, N jS, Y")) return format_html(base_format, _date(df, "D, N jS, Y"))
@@ -111,7 +103,7 @@ def daterange(df, dt, as_html=False):
until=until, until=until,
) )
return "{date_from}{until}{date_to}".format( return _("{date_from}{until}{date_to}").format(
date_from=_date(df, "DATE_FORMAT"), date_from=_date(df, "DATE_FORMAT"),
date_to=_date(dt, "DATE_FORMAT"), date_to=_date(dt, "DATE_FORMAT"),
until=until, until=until,
@@ -1,21 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/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 Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
@@ -1,50 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/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 Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
# Date according to https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
# Following NZ government guidance from https://www.digital.govt.nz/standards-and-guidance/design-and-ux/content-design-guidance/writing-style/numbers
DATE_FORMAT = "j F Y" # 12 December 2015
DATETIME_FORMAT = "j F Y, g:ia" # 12 December 2015, 5:30pm
TIME_FORMAT = "g:ia" # 5:30pm
YEAR_MONTH_FORMAT = "F Y" # December 2015
MONTH_DAY_FORMAT = "j F" # 12 December
SHORT_DATE_FORMAT = "j F Y" # same as DATE_FORMAT per guidance
SHORT_DATETIME_FORMAT = "j F Y, g:ia"
WEEKDAY_FORMAT = "l" # Monday
WEEKDAY_DATE_FORMAT = "l, j F Y" # Friday, 23 November 2018
WEEK_FORMAT = "\\W W, o" # ISO week: "W 52, 2024"
WEEK_DAY_FORMAT = "D, j M" # Abbrev weekday and month: "Mon, 5 Feb"
SHORT_MONTH_DAY_FORMAT = "j/n" # Numeric day/month: "5/2"
# Parsing inputs; keep d/m/Y and ISO
DATE_INPUT_FORMATS = [
"%d/%m/%Y",
"%Y-%m-%d",
"%d/%m/%y",
]
TIME_INPUT_FORMATS = [
"%I:%M%p", # 5:30pm
"%H:%M:%S",
"%H:%M:%S.%f",
"%H:%M",
]
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2021-09-15 11:22+0000\n" "PO-Revision-Date: 2021-09-15 11:22+0000\n"
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n" "Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -359,12 +359,12 @@ msgstr "لا"
msgid "close" msgid "close"
msgstr "إغلاق" msgstr "إغلاق"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "مطلوب" msgstr "مطلوب"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -372,11 +372,11 @@ msgstr ""
"تتم معالجة طلبك حاليا. قد يستغرق الأمر بضع دقائق بناء على حجم الفعالية التي " "تتم معالجة طلبك حاليا. قد يستغرق الأمر بضع دقائق بناء على حجم الفعالية التي "
"اخترت." "اخترت."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "طلبك قيد الانتظار وستتم معالجته قريبا." msgstr "طلبك قيد الانتظار وستتم معالجته قريبا."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -385,36 +385,36 @@ msgstr ""
"وصل طلبك للخادم وننتظر تنفيذه. إذا استغرق الأمر أكثر من دقيقتين تواصل معنا " "وصل طلبك للخادم وننتظر تنفيذه. إذا استغرق الأمر أكثر من دقيقتين تواصل معنا "
"أو عاود المحاولة مجددا." "أو عاود المحاولة مجددا."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "حدث خطأ من نوع {code}." msgstr "حدث خطأ من نوع {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "لم نتمكن من الاتصال بالخادم، لكن سنواصل المحاولة، رمز آخر خطأ: {code}" msgstr "لم نتمكن من الاتصال بالخادم، لكن سنواصل المحاولة، رمز آخر خطأ: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "استغرقت الطلب فترة طويلة، الرجاء المحاولة مرة أخرى." msgstr "استغرقت الطلب فترة طويلة، الرجاء المحاولة مرة أخرى."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
"لا يمكننا الوصول إلى الخادم حاليا، حاول مرة أخرى من فضلك. رمز الخطأ : {code}" "لا يمكننا الوصول إلى الخادم حاليا، حاول مرة أخرى من فضلك. رمز الخطأ : {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "جاري معالجة طلبك …" msgstr "جاري معالجة طلبك …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -423,11 +423,11 @@ msgstr ""
"نعمل الآن على ارسال طلبك إلى الخادم، إذا أستغرقت العملية أكثر من دقيقة، يرجى " "نعمل الآن على ارسال طلبك إلى الخادم، إذا أستغرقت العملية أكثر من دقيقة، يرجى "
"التحقق من اتصالك بالإنترنت ثم أعد تحميل الصفحة مرة أخرى." "التحقق من اتصالك بالإنترنت ثم أعد تحميل الصفحة مرة أخرى."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "أغلق الرسالة" msgstr "أغلق الرسالة"
@@ -798,7 +798,7 @@ msgstr "ستسترد %(currency)%(amount)"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "الرجاء إدخال المبلغ الذي يمكن للمنظم الاحتفاظ به." msgstr "الرجاء إدخال المبلغ الذي يمكن للمنظم الاحتفاظ به."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "التوقيت المحلي:" msgstr "التوقيت المحلي:"
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2020-12-19 07:00+0000\n" "PO-Revision-Date: 2020-12-19 07:00+0000\n"
"Last-Translator: albert <albert.serra.monner@gmail.com>\n" "Last-Translator: albert <albert.serra.monner@gmail.com>\n"
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -345,70 +345,70 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
#, fuzzy #, fuzzy
#| msgid "Cart expired" #| msgid "Cart expired"
msgid "required" msgid "required"
msgstr "Cistella expirada" msgstr "Cistella expirada"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Estem processant la vostra sol·licitud …" msgstr "Estem processant la vostra sol·licitud …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -751,7 +751,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+35 -29
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-09-08 18:57+0000\n" "PO-Revision-Date: 2025-05-16 17:00+0000\n"
"Last-Translator: Alois Pospíšil <alois.pospisil@gmail.com>\n" "Last-Translator: David <davemachala@gmail.com>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
"cs/>\n" "cs/>\n"
"Language: cs\n" "Language: cs\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.13\n" "X-Generator: Weblate 5.11.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -345,12 +345,12 @@ msgstr "Ne"
msgid "close" msgid "close"
msgstr "zavřít" msgstr "zavřít"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "povinný" msgstr "povinný"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -358,11 +358,11 @@ msgstr ""
"Váš požadavek je právě zpracováván. V závislosti na velikosti vaší udalosti, " "Váš požadavek je právě zpracováván. V závislosti na velikosti vaší udalosti, "
"to může trvat několik minut." "to může trvat několik minut."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "Váš požadavek byl vložem do fronty serveru a brzy bude zpracován." msgstr "Váš požadavek byl vložem do fronty serveru a brzy bude zpracován."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -372,14 +372,14 @@ msgstr ""
"Pokud to trvá více jak dvě minuty, prosím kontaktuje nás nebo se vraťte do " "Pokud to trvá více jak dvě minuty, prosím kontaktuje nás nebo se vraťte do "
"vašeho prohlížeče a zkuste to znovu." "vašeho prohlížeče a zkuste to znovu."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Vyskytla se chyba {code}." msgstr "Vyskytla se chyba {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -387,12 +387,12 @@ msgstr ""
"Momentálně nemůžeme kontaktovat server, ale stále se o to pokoušíme. " "Momentálně nemůžeme kontaktovat server, ale stále se o to pokoušíme. "
"Poslední chybový kód: {code}" "Poslední chybový kód: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Zpracování požadavku trvá příliš dlouho. Prosím zkuste to znovu." msgstr "Zpracování požadavku trvá příliš dlouho. Prosím zkuste to znovu."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -400,11 +400,11 @@ msgstr ""
"Momentálně nemůžeme kontaktovat server. Prosím zkuste to znovu. Chybový kód: " "Momentálně nemůžeme kontaktovat server. Prosím zkuste to znovu. Chybový kód: "
"{code}" "{code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Zpracováváme váš požadavek …" msgstr "Zpracováváme váš požadavek …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -414,11 +414,11 @@ msgstr ""
"prosím zkontrolujte své internetové připojení a znovu načtěte stránku a " "prosím zkontrolujte své internetové připojení a znovu načtěte stránku a "
"zkuste to znovu." "zkuste to znovu."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Zavřít zprávu" msgstr "Zavřít zprávu"
@@ -640,15 +640,19 @@ msgid "Unknown error."
msgstr "Neznámá chyba." msgstr "Neznámá chyba."
#: pretix/static/pretixcontrol/js/ui/main.js:292 #: pretix/static/pretixcontrol/js/ui/main.js:292
#, fuzzy
#| msgid "Your color has great contrast and is very easy to read!"
msgid "Your color has great contrast and will provide excellent accessibility." msgid "Your color has great contrast and will provide excellent accessibility."
msgstr "Tato barva má velmi dobrý kontrast a je velmi dobře čitelná." msgstr "Tato barva má velmi dobrý kontrast a je velmi dobře čitelná!"
#: pretix/static/pretixcontrol/js/ui/main.js:296 #: pretix/static/pretixcontrol/js/ui/main.js:296
#, fuzzy
#| msgid "Your color has decent contrast and is probably good-enough to read!"
msgid "" msgid ""
"Your color has decent contrast and is sufficient for minimum accessibility " "Your color has decent contrast and is sufficient for minimum accessibility "
"requirements." "requirements."
msgstr "" msgstr ""
"Tato barva má slušný kontrast a pravděpodobně je dostatečně dobře čitelná." "Tato barva má slušný kontrast a pravděpodobně je dostatečně dobře čitelná!"
#: pretix/static/pretixcontrol/js/ui/main.js:300 #: pretix/static/pretixcontrol/js/ui/main.js:300
msgid "" msgid ""
@@ -731,7 +735,7 @@ msgstr "Nákupní košík vypršel"
#: pretix/static/pretixpresale/js/ui/cart.js:58 #: pretix/static/pretixpresale/js/ui/cart.js:58
#: pretix/static/pretixpresale/js/ui/cart.js:84 #: pretix/static/pretixpresale/js/ui/cart.js:84
msgid "Your cart is about to expire." msgid "Your cart is about to expire."
msgstr "Nákupní košík brzy vyprší." msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:62 #: pretix/static/pretixpresale/js/ui/cart.js:62
msgid "The items in your cart are reserved for you for one minute." msgid "The items in your cart are reserved for you for one minute."
@@ -744,8 +748,10 @@ msgstr[2] ""
"Produkty v nákupním košíku jsou pro vás rezervovány na dalších {num} minut." "Produkty v nákupním košíku jsou pro vás rezervovány na dalších {num} minut."
#: pretix/static/pretixpresale/js/ui/cart.js:83 #: pretix/static/pretixpresale/js/ui/cart.js:83
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired." msgid "Your cart has expired."
msgstr "Nákupní košík vypršel." msgstr "Nákupní košík vypršel"
#: pretix/static/pretixpresale/js/ui/cart.js:86 #: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy #, fuzzy
@@ -779,7 +785,7 @@ msgstr "Dostanete %(currency)s %(amount)s zpět"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Zadejte částku, kterou si organizátor může ponechat." msgstr "Zadejte částku, kterou si organizátor může ponechat."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Místní čas:" msgstr "Místní čas:"
@@ -805,12 +811,12 @@ msgstr "Zvýšit počet"
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "Filtrovat události" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "Filtrovat" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget" msgctxt "widget"
@@ -927,7 +933,7 @@ msgstr "Již není k dispozici"
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "Momentálně není k dispozici" msgstr "Momentálně není k dispozici."
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#, javascript-format #, javascript-format
@@ -962,7 +968,7 @@ msgstr "Obchod vstupenek otevřit"
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "Přejít k platbě" msgstr "Checkout"
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
msgctxt "widget" msgctxt "widget"
@@ -1084,7 +1090,7 @@ msgstr "Předchozí týden"
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "Otevřete výběr míst" msgstr "Otevřete výběr sedadla"
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
msgctxt "widget" msgctxt "widget"
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -345,68 +345,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -741,7 +741,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2024-07-10 15:00+0000\n" "PO-Revision-Date: 2024-07-10 15:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n" "Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -357,14 +357,14 @@ msgstr "Nej"
msgid "close" msgid "close"
msgstr "Luk" msgstr "Luk"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
#, fuzzy #, fuzzy
#| msgid "Cart expired" #| msgid "Cart expired"
msgid "required" msgid "required"
msgstr "Kurv udløbet" msgstr "Kurv udløbet"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Your request has been queued on the server and will now be processed. " #| "Your request has been queued on the server and will now be processed. "
@@ -376,7 +376,7 @@ msgstr ""
"Din forespørgsel er under behandling. Alt efter størrelsen af din event kan " "Din forespørgsel er under behandling. Alt efter størrelsen af din event kan "
"der gå op til et par minutter." "der gå op til et par minutter."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Your request has been queued on the server and will now be processed. " #| "Your request has been queued on the server and will now be processed. "
@@ -386,7 +386,7 @@ msgstr ""
"Din forespørgsel er under behandling. Alt efter størrelsen af din event kan " "Din forespørgsel er under behandling. Alt efter størrelsen af din event kan "
"der gå op til et par minutter." "der gå op til et par minutter."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -395,14 +395,14 @@ msgstr ""
"Din forespørgsel er under behandling. Hvis der går mere end to minutter, så " "Din forespørgsel er under behandling. Hvis der går mere end to minutter, så "
"kontakt os eller gå tilbage og prøv igen." "kontakt os eller gå tilbage og prøv igen."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Der er sket en fejl ({code})." msgstr "Der er sket en fejl ({code})."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -410,12 +410,12 @@ msgstr ""
"Vi kan ikke komme i kontakt med serveren, men prøver igen. Seneste fejlkode: " "Vi kan ikke komme i kontakt med serveren, men prøver igen. Seneste fejlkode: "
"{code}" "{code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Forespørgslen tog for lang tid. Prøv igen." msgstr "Forespørgslen tog for lang tid. Prøv igen."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -423,11 +423,11 @@ msgstr ""
"Vi kan i øjeblikket ikke komme i kontakt med serveren. Prøv igen. Fejlkode: " "Vi kan i øjeblikket ikke komme i kontakt med serveren. Prøv igen. Fejlkode: "
"{code}" "{code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Vi behandler din bestilling …" msgstr "Vi behandler din bestilling …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -436,11 +436,11 @@ msgstr ""
"Din forespørgsel bliver sendt til serveren. Hvis det tager mere end et " "Din forespørgsel bliver sendt til serveren. Hvis det tager mere end et "
"minut, så tjek din internetforbindelse, genindlæs siden og prøv igen." "minut, så tjek din internetforbindelse, genindlæs siden og prøv igen."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Luk besked" msgstr "Luk besked"
@@ -810,7 +810,7 @@ msgstr "fra %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Din lokaltid:" msgstr "Din lokaltid:"
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-05-30 11:08+0000\n" "PO-Revision-Date: 2025-05-30 11:08+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n" "Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -345,12 +345,12 @@ msgstr "Nein"
msgid "close" msgid "close"
msgstr "schließen" msgstr "schließen"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "erforderlich" msgstr "erforderlich"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -358,13 +358,13 @@ msgstr ""
"Ihre Anfrage wird nun verarbeitet. Je nach Größe der Veranstaltung kann dies " "Ihre Anfrage wird nun verarbeitet. Je nach Größe der Veranstaltung kann dies "
"einige Minuten dauern." "einige Minuten dauern."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
"Ihre Anfrage befindet sich beim Server in der Warteschlange und wird bald " "Ihre Anfrage befindet sich beim Server in der Warteschlange und wird bald "
"verarbeitet." "verarbeitet."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -375,14 +375,14 @@ msgstr ""
"bitte oder gehen Sie in Ihrem Browser einen Schritt zurück und versuchen es " "bitte oder gehen Sie in Ihrem Browser einen Schritt zurück und versuchen es "
"erneut." "erneut."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Ein Fehler ist aufgetreten. Fehlercode: {code}" msgstr "Ein Fehler ist aufgetreten. Fehlercode: {code}"
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -390,12 +390,12 @@ msgstr ""
"Wir können den Server aktuell nicht erreichen, versuchen es aber weiter. " "Wir können den Server aktuell nicht erreichen, versuchen es aber weiter. "
"Letzter Fehlercode: {code}" "Letzter Fehlercode: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Diese Anfrage hat zu lange gedauert. Bitte erneut versuchen." msgstr "Diese Anfrage hat zu lange gedauert. Bitte erneut versuchen."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -403,11 +403,11 @@ msgstr ""
"Wir können den Server aktuell nicht erreichen. Bitte versuchen Sie es noch " "Wir können den Server aktuell nicht erreichen. Bitte versuchen Sie es noch "
"einmal. Fehlercode: {code}" "einmal. Fehlercode: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Wir verarbeiten Ihre Anfrage …" msgstr "Wir verarbeiten Ihre Anfrage …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -417,11 +417,11 @@ msgstr ""
"dauert, prüfen Sie bitte Ihre Internetverbindung. Danach können Sie diese " "dauert, prüfen Sie bitte Ihre Internetverbindung. Danach können Sie diese "
"Seite neu laden und es erneut versuchen." "Seite neu laden und es erneut versuchen."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "Wenn dies länger als einige Minuten dauert, kontaktiere uns bitte." msgstr "Wenn dies länger als einige Minuten dauert, kontaktiere uns bitte."
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Schließen" msgstr "Schließen"
@@ -771,7 +771,7 @@ msgstr "Sie erhalten %(currency)s %(amount)s zurück"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf." msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Deine lokale Zeit:" msgstr "Deine lokale Zeit:"
+141 -257
View File
@@ -1,143 +1,125 @@
ABGEKÜNDIGT 2FA
ABN ABN
AES
Absenderadresse Absenderadresse
Absenderinformation Absenderinformation
Absendername Absendername
ABGEKÜNDIGT
Admin Admin
Adminbereich Adminbereich
Admin-Modus
Admin-Sitzung
Admin-Sitzungen
AES
Affirm Affirm
AGPL AGPL
AGPLv AGPLv
Alipay Alipay
and and
API-Meta-Informationen
APM
App App
App-Gebühr
ApplePay ApplePay
Apps Apps
APM
as as
Aufbuchungen Aufbuchungen
aufeinanderfolgenden aufeinanderfolgenden
Aufteilungsliste
aufzubuchen aufzubuchen
auschecken auschecken
Ausgangsscan Ausgangsscan
Ausgangsscans Ausgangsscans
ausgecheckt
ausgeklappt ausgeklappt
ausgecheckt
auswahl auswahl
Auth
Authentication Authentication
Authenticator-App Authenticator
Authentifizierungsmechanismus
Autorisierungs
Autorisierungscode Autorisierungscode
Autorisierungs-Endpunktes Backend
Badge Badge
Badge-Druck
Badge-Layout
Badge-Layouts
Badges Badges
Bancontact Bancontact
Bank-App
BankID BankID
Banking-App Banking
barcodes
Baskisch Baskisch
Bcc Bcc
BCC-Adresse BCC
Bcc-Kopie
Beispielevent Beispielevent
Beispielproduktvariantenbeschreibung Beispielproduktvariantenbeschreibung
Belarus Belarus
Benachrichtigungs
Benachrichtigungsart Benachrichtigungsart
Benachrichtigungsarten Benachrichtigungsarten
Benachrichtigungseinstellungen Benachrichtigungseinstellungen
Benachrichtigungs-Einstellungen Berechtigungs
Benachrichtigungs-E-Mail Bestätigungs
Benutzer-ID-Feld Bestellbestätigungs
Benutzer-ID-Felds
Bestätigungs-E-Mail
Bestellbestätigungs-E-Mail
Bestellbestätigungs-E-Mails
Bestellungsänderungen Bestellungsänderungen
Bestellungs-Synchronisation Bestellungsstatus
Bestellungs-Synchronisierung Bestellungs
bez bez
BezahlCode BezahlCode
Bezahlmethode
Blackberry Blackberry
BLIK BLIK
BN-Code Blogpost
BN
Branding
Browsereinstellungen
BSD
bspw
Bokmål Bokmål
Boleto Boleto
Branding-Informationen Buchhaltungs
Browsereinstellungen
BSD-Lizenz
bspw
Bundles Bundles
Butterfly-Badge Butterfly
bzw bzw
ca ca
Cc
Ceuta Ceuta
Cc
chardet chardet
charge charge
Charge-ID
Checkbox Checkbox
Check-in-App
Check-in-Apps
Check-in-QR-Code
Checkout Checkout
Chrome Chrome
Client-ID Choice
Client-Secret Community
CODE.txt
Community-Übersetzungen
CONFIRM CONFIRM
Connect Connect
Cookie-Consent-Management Consent
Cookie-Consent-Mechanismus
Copyleft Copyleft
Cronjob Cronjob
Cronjob-Komponente Cross
Cross-Selling-Bedingung
Cross-Selling-Kategorie
Cross-Selling-Kategorien
Cross-Selling-Schritt
csv csv
CSV
CSV-Datei
CSV-Dateien
CSV-Eingabe
CSV-Eingabedaten
CSV-Import
CSV-Input
CSV-Lesen
CSV-Spalte
Customer Customer
CZK CZK
Debug-Modus Dashboard
Datensynchronisation
Debug
dekodi dekodi
Desktop-Apps deliverability
DNS
Di Di
Do Do
Doe
Downloadformat Downloadformat
Downloadseite
Dr Dr
Drag-and-Drop-Interfaces Drag
Droid
Drop
DSS
Edge Edge
Eingangsscan Eingangsscan
Einlassbuchung Einlassbuchung
Einlassdatum Einlassdatum
Einlasskontrolle Einlasskontrolle
Einlassuhrzeita
einzuchecken einzuchecken
email email
E-Mail-Renderer Enterprise
Enterprise-Lizenz EPC
Enterprise-Lizenzen
Enterprise-Plugin
Enterprise-Plugins
eps
EPS EPS
eps
Erstattungsbetrag Erstattungsbetrag
Erstattungsliste Erstattungsliste
Erstattungsmethode Erstattungsmethode
@@ -145,231 +127,175 @@ Erstattungsoptionen
Erstattungsstatus Erstattungsstatus
Erstattungsweg Erstattungsweg
erstmalig erstmalig
Erweiterungs
etc etc
EU-USt-ID-Nr
Event Event
Event-Eigenschaft
Eventeingang Eventeingang
Event-Erstellung Eventfirma
Event-Setup-Tool
Event-Ticketing-Software
Event-Ticketshop
Event-Übersicht
Event-Website
evtl evtl
Explorer Explorer
FA FA
Favicon Favicon
F-Droid
Footer Footer
Footer-Link
Footer-Text
Galicisch Galicisch
Geocoding gehostete
Geocoding-Daten geht's
Geo-Koordinaten GENEXAMPLE
Geräte-ID Geo
geocoding
gescannt gescannt
ggf ggf
Ggf GiroCode
giropay giropay
GPL
Grants Grants
Gruppierungsspalte
Gruppierungswert Gruppierungswert
Gruppierungsspalte
Guide Guide
Gutscheineinlöser Gutscheineinlöser
Händler-ID
Händler-PayPal-Konto
Hardware-Tokengenerator
herunterscrollen herunterscrollen
hochlädst hochlädst
HTML-E-Mail-Renderer
HTTPS HTTPS
HTTPS-Verbindungen IBAN
HTTPS-Website
IBANs IBANs
iCal iCal
ics-Kalenderdatei ics
ID ID
iDEAL iDEAL
IDs IDs
Inc Inc
inkl inkl
innen-Badges
innenname innenname
innennamen innennamen
innergemeinschaftliche innergemeinschaftliche
Innergemeinschaftlicher Innergemeinschaftlicher
Installations-ID Input
Integrationen Installations
integrationen
intra
INV
invalidieren invalidieren
invalidiert invalidiert
iOS
ISU ISU
iOS
Itaú Itaú
iTunes iTunes
JavaScript JavaScript
JSON-Datei JSON
Kategoriebeschreibung Kategoriebeschreibung
Key
Klarna Klarna
Kombitickets Kombitickets
Kompatibilitätsmodus
Konfigurations
Kosovo
land land
landesspezifische landesspezifische
Lead-Scanning Lead
Leaflet-Kacheln Leaflet
Linktext Linktext
lit lit
Log-ID
Logindaten Logindaten
Lösch
loszulegen
Ltd
Macau Macau
MapQuest-API-Key
max max
Medien-ID MariaDB
MapQuest
Melilla Melilla
Mercado Mercado
Merchandise Merchandise
Meta
Metadaten Metadaten
Meta-Eigenschaft
Meta-Eigenschaften
Meta-Informationen
Mi Mi
Mifare Mifare
min Mitgliedschafts
Mitgliedschaftsdauer Mitgliedschaftsdauer
Mitgliedschafts-Typ min
Mitgliedschafts-Typen
Mo Mo
MobilePay MobilePay
MOTO MOTO
MOTO-Zahlungen
Multibanco Multibanco
Multiple-Choice-Fragen
MwSt MwSt
MyBank MyBank
name name
NFC NFC
NFC-basierte
NFC-Chip
NFC-Chips
NFC-Medien
NFC-Zahlungsmitteln
Nr Nr
NREI NREI
number number
NXP NXP
Objekt-IDs
Offline-Scan
OK OK
Online-Banking On
Onlinebanking-Zugangsdaten Onlinebanking
Open Open
OpenCage-API-Key OpenCage
OpenID OpenID
OpenStreetMap OpenStreetMap
Opera Opera
Output
OXXO OXXO
Pago
parsen parsen
Pago
Pay Pay
PayPal PayPal
PayPal-Account PayPals
PayPal-Accounts
PayPal-Konto
PayPal-Kontos
PayPal-Sandbox
PayPal-Sandbox-Account
PayPal-Seite
PayPal-Verkaufs-ID
PayPal-Webhook
PayPal-Zahlung
PayPal-Zahlungen
PayPal-Zahlungs-ID
PayU PayU
PCI-DSS-Formulare PCI
Peppol-Netzwerk
Peppol-Teilnehmer-ID
Peppol-Teilnehmer-IDs
Personalisierung Personalisierung
PKCE-Erweiterung PEPPOL
PKCE
Platzhalterzeichen Platzhalterzeichen
Play Play
Plugin Plugin
Plugins Plugins
POS
Postfix Postfix
PostgreSQL
PPRO PPRO
prefix prefix
Prefix
pretix pretix
pretix-Apps pretixdesk
pretix-Benutzerkennung
pretixdesk-Apps
pretixdroid pretixdroid
pretix-Enterprise-Lizenz pretixPOS
pretix-Enterprise-Plugins
pretix-Entwickler
pretix-Entwicklern
pretix-Feld
pretix-Installation
pretix-Konto
pretix-Kontos
pretix-Logo
pretix-Logos
pretix-Plugins
pretixPRINT pretixPRINT
pretixPRINT-Version
pretixSCAN pretixSCAN
pretix-Support Professional
pretix-Team
pretix-Update
pretix-Version
pretix-Versionen
pretix-Widget
Produkt-ID
Produkt-Metadaten
Przelewy Przelewy
pt pt
px px
QR-Code Query
QR-Code-Bereich QR
QR-Code-Geheimnis
QR-Code-Inhalt
QR-Code-Reader
QR-Codes
QR-Farbe
Query-Parameter
rabattiert rabattiert
Rabattiert
Rabattierung Rabattierung
Rechnungs-E-Mail Reader
Rechnungs
Rechungsdatei Rechungsdatei
Reddit Reddit
Referer Referer
Registrierungs
Registrierungsdatum Registrierungsdatum
Registrierungs-Details
Registrierungsnummer Registrierungsnummer
Registrierungsversuche Registrierungsversuche
remote remote
Renderer
Request Request
Requests Requests
Request-URL
Reservierungszeitraum Reservierungszeitraum
reverse reverse
Reverse
Reverse-Proxy
Revisionssicherheit Revisionssicherheit
Revolut Revolut
Revolut-App
rückabgewickelt rückabgewickelt
Rundungsdifferenzen
Sa Sa
Saalplan
Sammlungsstücken Sammlungsstücken
SAQ SAQ
SCA SCA
Scan Scan
Scanning-Apps
Scans Scans
Scan-Terminals Scanergebnis
Scan-Typ Scanning
Scan-Zeitpunkt
schiefgeht schiefgeht
schiefgelaufen schiefgelaufen
Scope Scope
@@ -378,37 +304,23 @@ SdI
sechsstelligen sechsstelligen
Secret Secret
Security Security
selbst-gehostete Selling
SEPA-Bankeinzug SEPA
SEPA-Bankkonto Shirts
SEPA-Konten
SEPA-Lastschrift
SEPA-Lastschriften
SEPA-Mandat
SEPA-XML
Session-ID
Signaturverfahren Signaturverfahren
Single-Sign-On Sign
Single-Sign-On-Dienste
Single-Sign-On-Methode
Single-Sign-On-Provider
Sitzplanmoduls Sitzplanmoduls
Sitzplatz-ID Social
Sitzplatz-IDs Sofort
Social-Media-Bild SOFORT
Sorry Sorry
Source Source
Source-Codes SPF
SPF-Eintrag
SSL SSL
SSO SSO
SSO-Client
SSO-Clients
SSO-Provider
STARTTLS STARTTLS
Steuer-Aufteilungsliste
Steuerregel-ID
Steuerschuldnerschaft Steuerschuldnerschaft
Store
Stornierungsanfrage Stornierungsanfrage
Stornobedingungen Stornobedingungen
Stornobeleg Stornobeleg
@@ -418,75 +330,58 @@ Stornogebühren
Stornos Stornos
Strg Strg
Stripe Stripe
Stripe-Account Stripes
Stripe-App
Stripe-Dashboard
Stripe-Konto
Stripe-Kontos
Stripe-Modul
Stripe-Support
Stripe-Test-API
Strong Strong
Swish Swish
Synchronisations
systemweiten systemweiten
Tab Tab
tag tag
Teammitglied Teammitglied
Teamname Teamname
Teilnehmer-Badges
Telephone Telephone
Terminal-ID
Termin-ID
Ticketing Ticketing
Ticketing-Firma Timeout
Ticket-Output To
Ticket-QR-Code Tokengenerator
Toolbar
TODO TODO
To-Do-Liste
TOTP TOTP
Trace-Nummer Trace
Tracking Tracking
transaktionale transaktionale
Trustly Trustly
T-Shirts Turnover
Turnover-Nummer
TWINT TWINT
txt
überbuchen überbuchen
überbucht überbucht
überbuchten überbuchten
überzahlt überzahlt
Überzahlt
ÜBERZAHLT ÜBERZAHLT
überzahlte überzahlte
Überzahlte
Überzahlten
uhrzeit uhrzeit
UID UID
UID-Basis
UID-Schutzfunktion
Ultralight Ultralight
umzubuchen
ungespeicherte ungespeicherte
Unkategorisiert unkategorisiert
Unkategorisierte Unkategorisierte
unlöschbar unlöschbar
unlöschbaren unlöschbaren
untenstehende untenstehende
untenstehenden untenstehenden
Unterzahlt unterzahlt
UNTERZAHLT UNTERZAHLT
unzugeordnete unzugeordnete
Unzugeordnete
unzugeordneten unzugeordneten
umzubuchen
URIs URIs
Ursprüngl Ursprüngl
USt USt
USt-ID Überweisungs
USt-ID-Nr Überzahlten
USt-ID-Nummer
Validierung Validierung
Validierungsregeln Validierungsregeln
Varianten-ID
Venmo Venmo
Veranstalterdomain Veranstalterdomain
Veranstaltereinstellungen Veranstaltereinstellungen
@@ -499,50 +394,39 @@ Veranstalterseite
Veranstalterübersicht Veranstalterübersicht
veranstalterweiten veranstalterweiten
Veranstaltungs Veranstaltungs
Veranstaltungs-Metadaten Veranstalterdomain
veranstaltungsweiten veranstaltungsweiten
Verfügbarkeitsberechnung Verfügbarkeitsberechnung
Verfügbarkeitsstatus Verfügbarkeitsstatus
Verkaufs-ID
Verkkopankki Verkkopankki
Veröffentlichbarer Veröffentlichbarer
Verwendungszweck-Postfix VIP
VIP-Bereiches
Warenkorb-ID
Warenkorb-Timeout
WebAuthn WebAuthn
WebAuthn-Gerät
WebAuthn-kompatibler
WebAuthn-Token
WebAuthn-Unterstützung
Webhook Webhook
Webhooks Webhooks
Webhook-Wiederholungsaufträge Weiterleitungs
WeChat WeChat
WeChat-Zahlung
Weiterleitungs-URIs
Weiterleitungs-URL
Weiterleitungs-URLs
WhatsApp WhatsApp
Widget Widget
Widget-Code
xlsx xlsx
XXX XXX
XXXX XXXX
XXXXX
Yubikey Yubikey
Zahlungs Zahlungs
Zahlungsbestätigungs-E-Mail Zahlungsbestätigungs
Zahlungserinnerungs-E-Mail Zahlungserinnerungs
Zahlungs-ID zahlungspflichtig
Zahlungspflichtig Zahlungsplugins
Zehnerkarten Zehnerkarten
Zeitbasiert zeitbasiert
Zeitslotbuchung Zeitslotbuchung
Zimpler Zimpler
ZIP-Datei ZIP
zubuchbaren zubuchbaren
zurückbuchen
zurückgeleitet zurückgeleitet
zurückwechseln zurückwechseln
zutrittsberechtigt zutrittsberechtigt
ZVT-Terminal
zzgl zzgl
ZVT
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-05-30 11:07+0000\n" "PO-Revision-Date: 2025-05-30 11:07+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n" "Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/" "Language-Team: German (informal) <https://translate.pretix.eu/projects/"
@@ -345,12 +345,12 @@ msgstr "Nein"
msgid "close" msgid "close"
msgstr "schließen" msgstr "schließen"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "erforderlich" msgstr "erforderlich"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -358,13 +358,13 @@ msgstr ""
"Deine Anfrage wird nun verarbeitet. Je nach Größe der Veranstaltung kann " "Deine Anfrage wird nun verarbeitet. Je nach Größe der Veranstaltung kann "
"dies einige Minuten dauern." "dies einige Minuten dauern."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
"Deine Anfrage befindet sich beim Server in der Warteschlange und wird bald " "Deine Anfrage befindet sich beim Server in der Warteschlange und wird bald "
"verarbeitet." "verarbeitet."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -374,14 +374,14 @@ msgstr ""
"verarbeitet. Wenn dies länger als zwei Minuten dauert, kontaktiere uns bitte " "verarbeitet. Wenn dies länger als zwei Minuten dauert, kontaktiere uns bitte "
"oder gehe in deinem Browser einen Schritt zurück und versuche es erneut." "oder gehe in deinem Browser einen Schritt zurück und versuche es erneut."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Ein Fehler vom Typ {code} ist aufgetreten." msgstr "Ein Fehler vom Typ {code} ist aufgetreten."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -389,12 +389,12 @@ msgstr ""
"Wir können den Server aktuell nicht erreichen, versuchen es aber weiter. " "Wir können den Server aktuell nicht erreichen, versuchen es aber weiter. "
"Letzter Fehlercode: {code}" "Letzter Fehlercode: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Diese Anfrage hat zu lange gedauert. Bitte erneut versuchen." msgstr "Diese Anfrage hat zu lange gedauert. Bitte erneut versuchen."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -402,11 +402,11 @@ msgstr ""
"Wir können den Server aktuell nicht erreichen. Bitte versuche es noch " "Wir können den Server aktuell nicht erreichen. Bitte versuche es noch "
"einmal. Fehlercode: {code}" "einmal. Fehlercode: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Wir verarbeiten deine Anfrage …" msgstr "Wir verarbeiten deine Anfrage …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -416,12 +416,12 @@ msgstr ""
"dauert, prüfe bitte deine Internetverbindung. Danach kannst du diese Seite " "dauert, prüfe bitte deine Internetverbindung. Danach kannst du diese Seite "
"neu laden und es erneut versuchen." "neu laden und es erneut versuchen."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
"Wenn dies länger als einige Minuten dauert, kontaktieren Sie uns bitte." "Wenn dies länger als einige Minuten dauert, kontaktieren Sie uns bitte."
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Schließen" msgstr "Schließen"
@@ -771,7 +771,7 @@ msgstr "Du erhältst %(currency)s %(amount)s zurück"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf." msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Deine lokale Zeit:" msgstr "Deine lokale Zeit:"
+141 -257
View File
@@ -1,143 +1,125 @@
ABGEKÜNDIGT 2FA
ABN ABN
AES
Absenderadresse Absenderadresse
Absenderinformation Absenderinformation
Absendername Absendername
ABGEKÜNDIGT
Admin Admin
Adminbereich Adminbereich
Admin-Modus
Admin-Sitzung
Admin-Sitzungen
AES
Affirm Affirm
AGPL AGPL
AGPLv AGPLv
Alipay Alipay
and and
API-Meta-Informationen
APM
App App
App-Gebühr
ApplePay ApplePay
Apps Apps
APM
as as
Aufbuchungen Aufbuchungen
aufeinanderfolgenden aufeinanderfolgenden
Aufteilungsliste
aufzubuchen aufzubuchen
auschecken auschecken
Ausgangsscan Ausgangsscan
Ausgangsscans Ausgangsscans
ausgecheckt
ausgeklappt ausgeklappt
ausgecheckt
auswahl auswahl
Auth
Authentication Authentication
Authenticator-App Authenticator
Authentifizierungsmechanismus
Autorisierungs
Autorisierungscode Autorisierungscode
Autorisierungs-Endpunktes Backend
Badge Badge
Badge-Druck
Badge-Layout
Badge-Layouts
Badges Badges
Bancontact Bancontact
Bank-App
BankID BankID
Banking-App Banking
barcodes
Baskisch Baskisch
Bcc Bcc
BCC-Adresse BCC
Bcc-Kopie
Beispielevent Beispielevent
Beispielproduktvariantenbeschreibung Beispielproduktvariantenbeschreibung
Belarus Belarus
Benachrichtigungs
Benachrichtigungsart Benachrichtigungsart
Benachrichtigungsarten Benachrichtigungsarten
Benachrichtigungseinstellungen Benachrichtigungseinstellungen
Benachrichtigungs-Einstellungen Berechtigungs
Benachrichtigungs-E-Mail Bestätigungs
Benutzer-ID-Feld Bestellbestätigungs
Benutzer-ID-Felds
Bestätigungs-E-Mail
Bestellbestätigungs-E-Mail
Bestellbestätigungs-E-Mails
Bestellungsänderungen Bestellungsänderungen
Bestellungs-Synchronisation Bestellungsstatus
Bestellungs-Synchronisierung Bestellungs
bez bez
BezahlCode BezahlCode
Bezahlmethode
Blackberry Blackberry
BLIK BLIK
BN-Code Blogpost
BN
Branding
Browsereinstellungen
BSD
bspw
Bokmål Bokmål
Boleto Boleto
Branding-Informationen Buchhaltungs
Browsereinstellungen
BSD-Lizenz
bspw
Bundles Bundles
Butterfly-Badge Butterfly
bzw bzw
ca ca
Cc
Ceuta Ceuta
Cc
chardet chardet
charge charge
Charge-ID
Checkbox Checkbox
Check-in-App
Check-in-Apps
Check-in-QR-Code
Checkout Checkout
Chrome Chrome
Client-ID Choice
Client-Secret Community
CODE.txt
Community-Übersetzungen
CONFIRM CONFIRM
Connect Connect
Cookie-Consent-Management Consent
Cookie-Consent-Mechanismus
Copyleft Copyleft
Cronjob Cronjob
Cronjob-Komponente Cross
Cross-Selling-Bedingung
Cross-Selling-Kategorie
Cross-Selling-Kategorien
Cross-Selling-Schritt
csv csv
CSV
CSV-Datei
CSV-Dateien
CSV-Eingabe
CSV-Eingabedaten
CSV-Import
CSV-Input
CSV-Lesen
CSV-Spalte
Customer Customer
CZK CZK
Debug-Modus Dashboard
Datensynchronisation
Debug
dekodi dekodi
Desktop-Apps deliverability
DNS
Di Di
Do Do
Doe
Downloadformat Downloadformat
Downloadseite
Dr Dr
Drag-and-Drop-Interfaces Drag
Droid
Drop
DSS
Edge Edge
Eingangsscan Eingangsscan
Einlassbuchung Einlassbuchung
Einlassdatum Einlassdatum
Einlasskontrolle Einlasskontrolle
Einlassuhrzeita
einzuchecken einzuchecken
email email
E-Mail-Renderer Enterprise
Enterprise-Lizenz EPC
Enterprise-Lizenzen
Enterprise-Plugin
Enterprise-Plugins
eps
EPS EPS
eps
Erstattungsbetrag Erstattungsbetrag
Erstattungsliste Erstattungsliste
Erstattungsmethode Erstattungsmethode
@@ -145,231 +127,175 @@ Erstattungsoptionen
Erstattungsstatus Erstattungsstatus
Erstattungsweg Erstattungsweg
erstmalig erstmalig
Erweiterungs
etc etc
EU-USt-ID-Nr
Event Event
Event-Eigenschaft
Eventeingang Eventeingang
Event-Erstellung Eventfirma
Event-Setup-Tool
Event-Ticketing-Software
Event-Ticketshop
Event-Übersicht
Event-Website
evtl evtl
Explorer Explorer
FA FA
Favicon Favicon
F-Droid
Footer Footer
Footer-Link
Footer-Text
Galicisch Galicisch
Geocoding gehostete
Geocoding-Daten geht's
Geo-Koordinaten GENEXAMPLE
Geräte-ID Geo
geocoding
gescannt gescannt
ggf ggf
Ggf GiroCode
giropay giropay
GPL
Grants Grants
Gruppierungsspalte
Gruppierungswert Gruppierungswert
Gruppierungsspalte
Guide Guide
Gutscheineinlöser Gutscheineinlöser
Händler-ID
Händler-PayPal-Konto
Hardware-Tokengenerator
herunterscrollen herunterscrollen
hochlädst hochlädst
HTML-E-Mail-Renderer
HTTPS HTTPS
HTTPS-Verbindungen IBAN
HTTPS-Website
IBANs IBANs
iCal iCal
ics-Kalenderdatei ics
ID ID
iDEAL iDEAL
IDs IDs
Inc Inc
inkl inkl
innen-Badges
innenname innenname
innennamen innennamen
innergemeinschaftliche innergemeinschaftliche
Innergemeinschaftlicher Innergemeinschaftlicher
Installations-ID Input
Integrationen Installations
integrationen
intra
INV
invalidieren invalidieren
invalidiert invalidiert
iOS
ISU ISU
iOS
Itaú Itaú
iTunes iTunes
JavaScript JavaScript
JSON-Datei JSON
Kategoriebeschreibung Kategoriebeschreibung
Key
Klarna Klarna
Kombitickets Kombitickets
Kompatibilitätsmodus
Konfigurations
Kosovo
land land
landesspezifische landesspezifische
Lead-Scanning Lead
Leaflet-Kacheln Leaflet
Linktext Linktext
lit lit
Log-ID
Logindaten Logindaten
Lösch
loszulegen
Ltd
Macau Macau
MapQuest-API-Key
max max
Medien-ID MariaDB
MapQuest
Melilla Melilla
Mercado Mercado
Merchandise Merchandise
Meta
Metadaten Metadaten
Meta-Eigenschaft
Meta-Eigenschaften
Meta-Informationen
Mi Mi
Mifare Mifare
min Mitgliedschafts
Mitgliedschaftsdauer Mitgliedschaftsdauer
Mitgliedschafts-Typ min
Mitgliedschafts-Typen
Mo Mo
MobilePay MobilePay
MOTO MOTO
MOTO-Zahlungen
Multibanco Multibanco
Multiple-Choice-Fragen
MwSt MwSt
MyBank MyBank
name name
NFC NFC
NFC-basierte
NFC-Chip
NFC-Chips
NFC-Medien
NFC-Zahlungsmitteln
Nr Nr
NREI NREI
number number
NXP NXP
Objekt-IDs
Offline-Scan
OK OK
Online-Banking On
Onlinebanking-Zugangsdaten Onlinebanking
Open Open
OpenCage-API-Key OpenCage
OpenID OpenID
OpenStreetMap OpenStreetMap
Opera Opera
Output
OXXO OXXO
Pago
parsen parsen
Pago
Pay Pay
PayPal PayPal
PayPal-Account PayPals
PayPal-Accounts
PayPal-Konto
PayPal-Kontos
PayPal-Sandbox
PayPal-Sandbox-Account
PayPal-Seite
PayPal-Verkaufs-ID
PayPal-Webhook
PayPal-Zahlung
PayPal-Zahlungen
PayPal-Zahlungs-ID
PayU PayU
PCI-DSS-Formulare PCI
Peppol-Netzwerk
Peppol-Teilnehmer-ID
Peppol-Teilnehmer-IDs
Personalisierung Personalisierung
PKCE-Erweiterung PEPPOL
PKCE
Platzhalterzeichen Platzhalterzeichen
Play Play
Plugin Plugin
Plugins Plugins
POS
Postfix Postfix
PostgreSQL
PPRO PPRO
prefix prefix
Prefix
pretix pretix
pretix-Apps pretixdesk
pretix-Benutzerkennung
pretixdesk-Apps
pretixdroid pretixdroid
pretix-Enterprise-Lizenz pretixPOS
pretix-Enterprise-Plugins
pretix-Entwickler
pretix-Entwicklern
pretix-Feld
pretix-Installation
pretix-Konto
pretix-Kontos
pretix-Logo
pretix-Logos
pretix-Plugins
pretixPRINT pretixPRINT
pretixPRINT-Version
pretixSCAN pretixSCAN
pretix-Support Professional
pretix-Team
pretix-Update
pretix-Version
pretix-Versionen
pretix-Widget
Produkt-ID
Produkt-Metadaten
Przelewy Przelewy
pt pt
px px
QR-Code Query
QR-Code-Bereich QR
QR-Code-Geheimnis
QR-Code-Inhalt
QR-Code-Reader
QR-Codes
QR-Farbe
Query-Parameter
rabattiert rabattiert
Rabattiert
Rabattierung Rabattierung
Rechnungs-E-Mail Reader
Rechnungs
Rechungsdatei Rechungsdatei
Reddit Reddit
Referer Referer
Registrierungs
Registrierungsdatum Registrierungsdatum
Registrierungs-Details
Registrierungsnummer Registrierungsnummer
Registrierungsversuche Registrierungsversuche
remote remote
Renderer
Request Request
Requests Requests
Request-URL
Reservierungszeitraum Reservierungszeitraum
reverse reverse
Reverse
Reverse-Proxy
Revisionssicherheit Revisionssicherheit
Revolut Revolut
Revolut-App
rückabgewickelt rückabgewickelt
Rundungsdifferenzen
Sa Sa
Saalplan
Sammlungsstücken Sammlungsstücken
SAQ SAQ
SCA SCA
Scan Scan
Scanning-Apps
Scans Scans
Scan-Terminals Scanergebnis
Scan-Typ Scanning
Scan-Zeitpunkt
schiefgeht schiefgeht
schiefgelaufen schiefgelaufen
Scope Scope
@@ -378,37 +304,23 @@ SdI
sechsstelligen sechsstelligen
Secret Secret
Security Security
selbst-gehostete Selling
SEPA-Bankeinzug SEPA
SEPA-Bankkonto Shirts
SEPA-Konten
SEPA-Lastschrift
SEPA-Lastschriften
SEPA-Mandat
SEPA-XML
Session-ID
Signaturverfahren Signaturverfahren
Single-Sign-On Sign
Single-Sign-On-Dienste
Single-Sign-On-Methode
Single-Sign-On-Provider
Sitzplanmoduls Sitzplanmoduls
Sitzplatz-ID Social
Sitzplatz-IDs Sofort
Social-Media-Bild SOFORT
Sorry Sorry
Source Source
Source-Codes SPF
SPF-Eintrag
SSL SSL
SSO SSO
SSO-Client
SSO-Clients
SSO-Provider
STARTTLS STARTTLS
Steuer-Aufteilungsliste
Steuerregel-ID
Steuerschuldnerschaft Steuerschuldnerschaft
Store
Stornierungsanfrage Stornierungsanfrage
Stornobedingungen Stornobedingungen
Stornobeleg Stornobeleg
@@ -418,75 +330,58 @@ Stornogebühren
Stornos Stornos
Strg Strg
Stripe Stripe
Stripe-Account Stripes
Stripe-App
Stripe-Dashboard
Stripe-Konto
Stripe-Kontos
Stripe-Modul
Stripe-Support
Stripe-Test-API
Strong Strong
Swish Swish
Synchronisations
systemweiten systemweiten
Tab Tab
tag tag
Teammitglied Teammitglied
Teamname Teamname
Teilnehmer-Badges
Telephone Telephone
Terminal-ID
Termin-ID
Ticketing Ticketing
Ticketing-Firma Timeout
Ticket-Output To
Ticket-QR-Code Tokengenerator
Toolbar
TODO TODO
To-Do-Liste
TOTP TOTP
Trace-Nummer Trace
Tracking Tracking
transaktionale transaktionale
Trustly Trustly
T-Shirts Turnover
Turnover-Nummer
TWINT TWINT
txt
überbuchen überbuchen
überbucht überbucht
überbuchten überbuchten
überzahlt überzahlt
Überzahlt
ÜBERZAHLT ÜBERZAHLT
überzahlte überzahlte
Überzahlte
Überzahlten
uhrzeit uhrzeit
UID UID
UID-Basis
UID-Schutzfunktion
Ultralight Ultralight
umzubuchen
ungespeicherte ungespeicherte
Unkategorisiert unkategorisiert
Unkategorisierte Unkategorisierte
unlöschbar unlöschbar
unlöschbaren unlöschbaren
untenstehende untenstehende
untenstehenden untenstehenden
Unterzahlt unterzahlt
UNTERZAHLT UNTERZAHLT
unzugeordnete unzugeordnete
Unzugeordnete
unzugeordneten unzugeordneten
umzubuchen
URIs URIs
Ursprüngl Ursprüngl
USt USt
USt-ID Überweisungs
USt-ID-Nr Überzahlten
USt-ID-Nummer
Validierung Validierung
Validierungsregeln Validierungsregeln
Varianten-ID
Venmo Venmo
Veranstalterdomain Veranstalterdomain
Veranstaltereinstellungen Veranstaltereinstellungen
@@ -499,50 +394,39 @@ Veranstalterseite
Veranstalterübersicht Veranstalterübersicht
veranstalterweiten veranstalterweiten
Veranstaltungs Veranstaltungs
Veranstaltungs-Metadaten Veranstalterdomain
veranstaltungsweiten veranstaltungsweiten
Verfügbarkeitsberechnung Verfügbarkeitsberechnung
Verfügbarkeitsstatus Verfügbarkeitsstatus
Verkaufs-ID
Verkkopankki Verkkopankki
Veröffentlichbarer Veröffentlichbarer
Verwendungszweck-Postfix VIP
VIP-Bereiches
Warenkorb-ID
Warenkorb-Timeout
WebAuthn WebAuthn
WebAuthn-Gerät
WebAuthn-kompatibler
WebAuthn-Token
WebAuthn-Unterstützung
Webhook Webhook
Webhooks Webhooks
Webhook-Wiederholungsaufträge Weiterleitungs
WeChat WeChat
WeChat-Zahlung
Weiterleitungs-URIs
Weiterleitungs-URL
Weiterleitungs-URLs
WhatsApp WhatsApp
Widget Widget
Widget-Code
xlsx xlsx
XXX XXX
XXXX XXXX
XXXXX
Yubikey Yubikey
Zahlungs Zahlungs
Zahlungsbestätigungs-E-Mail Zahlungsbestätigungs
Zahlungserinnerungs-E-Mail Zahlungserinnerungs
Zahlungs-ID zahlungspflichtig
Zahlungspflichtig Zahlungsplugins
Zehnerkarten Zehnerkarten
Zeitbasiert zeitbasiert
Zeitslotbuchung Zeitslotbuchung
Zimpler Zimpler
ZIP-Datei ZIP
zubuchbaren zubuchbaren
zurückbuchen
zurückgeleitet zurückgeleitet
zurückwechseln zurückwechseln
zutrittsberechtigt zutrittsberechtigt
ZVT-Terminal
zzgl zzgl
ZVT
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:36+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2024-12-22 00:00+0000\n" "PO-Revision-Date: 2024-12-22 00:00+0000\n"
"Last-Translator: Dimitris Tsimpidis <tsimpidisd@gmail.com>\n" "Last-Translator: Dimitris Tsimpidis <tsimpidisd@gmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -361,14 +361,14 @@ msgstr "Όχι"
msgid "close" msgid "close"
msgstr "Κλείσιμο" msgstr "Κλείσιμο"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
#, fuzzy #, fuzzy
#| msgid "Cart expired" #| msgid "Cart expired"
msgid "required" msgid "required"
msgstr "Το καλάθι έληξε" msgstr "Το καλάθι έληξε"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Your request has been queued on the server and will now be processed. " #| "Your request has been queued on the server and will now be processed. "
@@ -381,7 +381,7 @@ msgstr ""
"επεξεργασία. Ανάλογα με το μέγεθος του συμβάντος σας, αυτό μπορεί να " "επεξεργασία. Ανάλογα με το μέγεθος του συμβάντος σας, αυτό μπορεί να "
"διαρκέσει μερικά λεπτά." "διαρκέσει μερικά λεπτά."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Your request has been queued on the server and will now be processed. " #| "Your request has been queued on the server and will now be processed. "
@@ -392,7 +392,7 @@ msgstr ""
"επεξεργασία. Ανάλογα με το μέγεθος του συμβάντος σας, αυτό μπορεί να " "επεξεργασία. Ανάλογα με το μέγεθος του συμβάντος σας, αυτό μπορεί να "
"διαρκέσει μερικά λεπτά." "διαρκέσει μερικά λεπτά."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -402,14 +402,14 @@ msgstr ""
"του. Αν αυτό διαρκεί περισσότερο από δύο λεπτά, επικοινωνήστε μαζί μας ή " "του. Αν αυτό διαρκεί περισσότερο από δύο λεπτά, επικοινωνήστε μαζί μας ή "
"επιστρέψτε στο πρόγραμμα περιήγησής σας και δοκιμάστε ξανά." "επιστρέψτε στο πρόγραμμα περιήγησής σας και δοκιμάστε ξανά."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Παρουσιάστηκε σφάλμα τύπου {code}." msgstr "Παρουσιάστηκε σφάλμα τύπου {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -417,14 +417,14 @@ msgstr ""
"Αυτήν τη στιγμή δεν μπορούμε να φτάσουμε στο διακομιστή, αλλά συνεχίζουμε να " "Αυτήν τη στιγμή δεν μπορούμε να φτάσουμε στο διακομιστή, αλλά συνεχίζουμε να "
"προσπαθούμε. Τελευταίος κωδικός σφάλματος: {code}" "προσπαθούμε. Τελευταίος κωδικός σφάλματος: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
#, fuzzy #, fuzzy
#| msgid "The request took to long. Please try again." #| msgid "The request took to long. Please try again."
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Το αίτημα διήρκησε πολύ. Παρακαλώ προσπαθήστε ξανά." msgstr "Το αίτημα διήρκησε πολύ. Παρακαλώ προσπαθήστε ξανά."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -432,11 +432,11 @@ msgstr ""
"Αυτήν τη στιγμή δεν μπορούμε να συνδεθούμε με το διακομιστή. Παρακαλώ " "Αυτήν τη στιγμή δεν μπορούμε να συνδεθούμε με το διακομιστή. Παρακαλώ "
"προσπαθήστε ξανά. Κωδικός σφάλματος: {code}" "προσπαθήστε ξανά. Κωδικός σφάλματος: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Επεξεργαζόμαστε το αίτημά σας …" msgstr "Επεξεργαζόμαστε το αίτημά σας …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -446,11 +446,11 @@ msgstr ""
"περισσότερο από ένα λεπτό, ελέγξτε τη σύνδεσή σας στο διαδίκτυο και στη " "περισσότερο από ένα λεπτό, ελέγξτε τη σύνδεσή σας στο διαδίκτυο και στη "
"συνέχεια επαναλάβετε τη φόρτωση αυτής της σελίδας και δοκιμάστε ξανά." "συνέχεια επαναλάβετε τη φόρτωση αυτής της σελίδας και δοκιμάστε ξανά."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Κλείσιμο μηνύματος" msgstr "Κλείσιμο μηνύματος"
@@ -820,7 +820,7 @@ msgstr "απο %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-05-30 11:15+0000\n" "PO-Revision-Date: 2025-05-30 11:15+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -345,12 +345,12 @@ msgstr "No"
msgid "close" msgid "close"
msgstr "cerrar" msgstr "cerrar"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "campo requerido" msgstr "campo requerido"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -358,11 +358,11 @@ msgstr ""
"Su solicitud está siendo procesada. Esto puede tardar varios minutos, " "Su solicitud está siendo procesada. Esto puede tardar varios minutos, "
"dependiendo del tamaño de su evento." "dependiendo del tamaño de su evento."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "Su solicitud ha sido enviada al servidor y será procesada en breve." msgstr "Su solicitud ha sido enviada al servidor y será procesada en breve."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -372,14 +372,14 @@ msgstr ""
"Si toma más de dos minutos, por favor contáctenos o regrese a la página " "Si toma más de dos minutos, por favor contáctenos o regrese a la página "
"anterior en su navegador e intente de nuevo." "anterior en su navegador e intente de nuevo."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Ha ocurrido un error de tipo {code}." msgstr "Ha ocurrido un error de tipo {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -387,12 +387,12 @@ msgstr ""
"Ahora mismo no podemos contactar con el servidor, pero lo seguimos " "Ahora mismo no podemos contactar con el servidor, pero lo seguimos "
"intentando. El último código de error fue: {code}" "intentando. El último código de error fue: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "La solicitud ha tomado demasiado tiempo. Por favor, intente de nuevo." msgstr "La solicitud ha tomado demasiado tiempo. Por favor, intente de nuevo."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -400,11 +400,11 @@ msgstr ""
"Ahora mismo no podemos contactar con el servidor. Por favor, intente de " "Ahora mismo no podemos contactar con el servidor. Por favor, intente de "
"nuevo. Código de error: {code}" "nuevo. Código de error: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Estamos procesando su solicitud…" msgstr "Estamos procesando su solicitud…"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -414,11 +414,11 @@ msgstr ""
"minuto, por favor, revise su conexión a Internet, recargue la página e " "minuto, por favor, revise su conexión a Internet, recargue la página e "
"intente nuevamente." "intente nuevamente."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros." msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros."
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Cerrar mensaje" msgstr "Cerrar mensaje"
@@ -768,7 +768,7 @@ msgstr "Obtienes %(currency)s %(price)s de vuelta"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Por favor, ingrese el importe que el organizador puede quedarse." msgstr "Por favor, ingrese el importe que el organizador puede quedarse."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Su hora local:" msgstr "Su hora local:"
File diff suppressed because it is too large Load Diff
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-08-04 14:16+0200\n" "PO-Revision-Date: 2025-08-04 14:16+0200\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -345,68 +345,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -741,7 +741,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2024-09-06 08:47+0000\n" "PO-Revision-Date: 2024-09-06 08:47+0000\n"
"Last-Translator: Albizuri <oier@puntu.eus>\n" "Last-Translator: Albizuri <oier@puntu.eus>\n"
"Language-Team: Basque <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Basque <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -345,12 +345,12 @@ msgstr "Ez"
msgid "close" msgid "close"
msgstr "itxi" msgstr "itxi"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -358,11 +358,11 @@ msgstr ""
"Zure eskaera prozesatzen ari dira. Gertaeraren tamainaren arabera, baliteke " "Zure eskaera prozesatzen ari dira. Gertaeraren tamainaren arabera, baliteke "
"minutu batzuk behar izatea." "minutu batzuk behar izatea."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "Zure eskaera zerbitzarian gorde da eta laster prozesatuko da." msgstr "Zure eskaera zerbitzarian gorde da eta laster prozesatuko da."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -372,14 +372,14 @@ msgstr ""
"Bi minutu baino gehiago irauten badu, mesedez, jarri gurekin harremanetan " "Bi minutu baino gehiago irauten badu, mesedez, jarri gurekin harremanetan "
"edo itzuli zure nabigatzailera eta saiatu berriro." "edo itzuli zure nabigatzailera eta saiatu berriro."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "{kode} motako errore bat gertatu da." msgstr "{kode} motako errore bat gertatu da."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -387,12 +387,12 @@ msgstr ""
"Orain bertan ezin gara zerbitzarira iritsi, baina saiatzen jarraitzen dugu. " "Orain bertan ezin gara zerbitzarira iritsi, baina saiatzen jarraitzen dugu. "
"Azken errore-kodea: {kodea}" "Azken errore-kodea: {kodea}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Gehiegi luzatu da eskaera. Mesedez, saiatu berriro." msgstr "Gehiegi luzatu da eskaera. Mesedez, saiatu berriro."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -400,11 +400,11 @@ msgstr ""
"Une honetan ezin gara zerbitzarira iritsi. Mesedez, saiatu berriro. Errore-" "Une honetan ezin gara zerbitzarira iritsi. Mesedez, saiatu berriro. Errore-"
"kodea: {kodea}" "kodea: {kodea}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Zure eskaera prozesatzen ari gara …" msgstr "Zure eskaera prozesatzen ari gara …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -414,11 +414,11 @@ msgstr ""
"baino gehiago irauten badu, mesedez, berrikusi zure Interneteko konexioa eta " "baino gehiago irauten badu, mesedez, berrikusi zure Interneteko konexioa eta "
"gero kargatu berriro orri hau eta saiatu berriro." "gero kargatu berriro orri hau eta saiatu berriro."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Mezua itxi" msgstr "Mezua itxi"
@@ -766,7 +766,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2021-11-10 05:00+0000\n" "PO-Revision-Date: 2021-11-10 05:00+0000\n"
"Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n" "Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -363,49 +363,49 @@ msgstr "Ei"
msgid "close" msgid "close"
msgstr "Sulje" msgstr "Sulje"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
#, fuzzy #, fuzzy
#| msgid "Cart expired" #| msgid "Cart expired"
msgid "required" msgid "required"
msgstr "Ostoskori on vanhentunut" msgstr "Ostoskori on vanhentunut"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Tapahtui virhe. Virhekoodi: {code}." msgstr "Tapahtui virhe. Virhekoodi: {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "Pyyntö aikakatkaistiin. Ole hyvä ja yritä uudelleen." msgstr "Pyyntö aikakatkaistiin. Ole hyvä ja yritä uudelleen."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -413,22 +413,22 @@ msgstr ""
"Palvelimeen ei juuri nyt saatu yhteyttä. Ole hyvä ja yritä uudelleen. " "Palvelimeen ei juuri nyt saatu yhteyttä. Ole hyvä ja yritä uudelleen. "
"Virhekoodi: {code}" "Virhekoodi: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Pyyntöäsi käsitellään …" msgstr "Pyyntöäsi käsitellään …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Sulje viesti" msgstr "Sulje viesti"
@@ -783,7 +783,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -344,68 +344,68 @@ msgstr ""
msgid "close" msgid "close"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
"browser and try again." "browser and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -740,7 +740,7 @@ msgstr ""
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+20 -20
View File
@@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: French\n" "Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-08-28 23:00+0000\n" "PO-Revision-Date: 2025-05-30 11:06+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n" "fr/>\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.13\n" "X-Generator: Weblate 5.11.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -344,12 +344,12 @@ msgstr "Non"
msgid "close" msgid "close"
msgstr "fermer" msgstr "fermer"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "obligatoire" msgstr "obligatoire"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -357,13 +357,13 @@ msgstr ""
"Votre demande est maintenant en cours de traitement. Selon la taille de " "Votre demande est maintenant en cours de traitement. Selon la taille de "
"votre événement, cela peut prendre jusqu' à quelques minutes." "votre événement, cela peut prendre jusqu' à quelques minutes."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "" msgstr ""
"Votre demande a été mise en attente sur le serveur et sera traitée " "Votre demande a été mise en attente sur le serveur et sera traitée "
"prochainement." "prochainement."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -373,14 +373,14 @@ msgstr ""
"prend plus de deux minutes, veuillez nous contacter ou retourner dans votre " "prend plus de deux minutes, veuillez nous contacter ou retourner dans votre "
"navigateur et réessayer." "navigateur et réessayer."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Une erreur de type {code} s'est produite." msgstr "Une erreur de type {code} s'est produite."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -388,12 +388,12 @@ msgstr ""
"Nous ne pouvons actuellement pas atteindre le serveur, mais nous continuons " "Nous ne pouvons actuellement pas atteindre le serveur, mais nous continuons "
"d'essayer. Dernier code d'erreur: {code}" "d'essayer. Dernier code d'erreur: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "La requête a prit trop de temps. Veuillez réessayer." msgstr "La requête a prit trop de temps. Veuillez réessayer."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -401,11 +401,11 @@ msgstr ""
"Actuellement, nous ne pouvons pas atteindre le serveur. Veuillez réessayer. " "Actuellement, nous ne pouvons pas atteindre le serveur. Veuillez réessayer. "
"Code d'erreur: {code}" "Code d'erreur: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Nous traitons votre demande …" msgstr "Nous traitons votre demande …"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -415,11 +415,11 @@ msgstr ""
"d'une minute, veuillez vérifier votre connexion Internet, puis recharger " "d'une minute, veuillez vérifier votre connexion Internet, puis recharger "
"cette page et réessayer." "cette page et réessayer."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "Si cela prend plus de quelques minutes, veuillez nous contacter." msgstr "Si cela prend plus de quelques minutes, veuillez nous contacter."
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Fermer le message" msgstr "Fermer le message"
@@ -551,7 +551,7 @@ msgstr "minutes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:192 #: pretix/static/pretixcontrol/js/ui/checkinrules.js:192
msgid "Duplicate" msgid "Duplicate"
msgstr "Dupliquer" msgstr "Doublon"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193 #: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
msgctxt "entry_status" msgctxt "entry_status"
@@ -768,7 +768,7 @@ msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
"Veuillez indiquer le montant que l'organisateur est autorisé à retenir." "Veuillez indiquer le montant que l'organisateur est autorisé à retenir."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "Votre heure locale:" msgstr "Votre heure locale:"
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2022-02-22 22:00+0000\n" "PO-Revision-Date: 2022-02-22 22:00+0000\n"
"Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n" "Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -351,12 +351,12 @@ msgstr "Non"
msgid "close" msgid "close"
msgstr "cerrar" msgstr "cerrar"
#: pretix/static/pretixbase/js/addressform.js:90 #: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:519 #: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required" msgid "required"
msgstr "campo requirido" msgstr "campo requirido"
#: pretix/static/pretixbase/js/asynctask.js:13 #: pretix/static/pretixbase/js/asynctask.js:12
msgid "" msgid ""
"Your request is currently being processed. Depending on the size of your " "Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes." "event, this might take up to a few minutes."
@@ -364,11 +364,11 @@ msgstr ""
"A súa solicitude estase procesando. Isto pode tardar varios minutos, " "A súa solicitude estase procesando. Isto pode tardar varios minutos, "
"dependendo do tamaño do seu evento." "dependendo do tamaño do seu evento."
#: pretix/static/pretixbase/js/asynctask.js:17 #: pretix/static/pretixbase/js/asynctask.js:16
msgid "Your request has been queued on the server and will soon be processed." msgid "Your request has been queued on the server and will soon be processed."
msgstr "A súa solicitude foi enviada ao servidor e será procesada en breve." msgstr "A súa solicitude foi enviada ao servidor e será procesada en breve."
#: pretix/static/pretixbase/js/asynctask.js:21 #: pretix/static/pretixbase/js/asynctask.js:20
msgid "" msgid ""
"Your request arrived on the server but we still wait for it to be processed. " "Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your " "If this takes longer than two minutes, please contact us or go back in your "
@@ -378,14 +378,14 @@ msgstr ""
"procesada. Se tarda máis de dous minutos, por favor, contacte con nós ou " "procesada. Se tarda máis de dous minutos, por favor, contacte con nós ou "
"volva á páxina anterior no seu navegador e inténteo de novo." "volva á páxina anterior no seu navegador e inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:125 #: pretix/static/pretixbase/js/asynctask.js:119
#: pretix/static/pretixbase/js/asynctask.js:182 #: pretix/static/pretixbase/js/asynctask.js:176
#: pretix/static/pretixbase/js/asynctask.js:186 #: pretix/static/pretixbase/js/asynctask.js:180
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "Ocurreu un error de tipo {code}." msgstr "Ocurreu un error de tipo {code}."
#: pretix/static/pretixbase/js/asynctask.js:128 #: pretix/static/pretixbase/js/asynctask.js:122
msgid "" msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: " "We currently cannot reach the server, but we keep trying. Last error code: "
"{code}" "{code}"
@@ -393,12 +393,12 @@ msgstr ""
"Agora mesmo non podemos contactar co servidor, pero seguímolo intentando. O " "Agora mesmo non podemos contactar co servidor, pero seguímolo intentando. O "
"último código de erro foi: {code}" "último código de erro foi: {code}"
#: pretix/static/pretixbase/js/asynctask.js:162 #: pretix/static/pretixbase/js/asynctask.js:156
#: pretix/static/pretixcontrol/js/ui/mail.js:21 #: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "A petición levou demasiado tempo. Inténteo de novo." msgstr "A petición levou demasiado tempo. Inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:188 #: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
@@ -406,11 +406,11 @@ msgstr ""
"Agora mesmo non podemos contactar co servidor. Por favor, inténteo de novo. " "Agora mesmo non podemos contactar co servidor. Por favor, inténteo de novo. "
"Código de erro: {code}" "Código de erro: {code}"
#: pretix/static/pretixbase/js/asynctask.js:216 #: pretix/static/pretixbase/js/asynctask.js:210
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "Estamos procesando a súa solicitude…" msgstr "Estamos procesando a súa solicitude…"
#: pretix/static/pretixbase/js/asynctask.js:219 #: pretix/static/pretixbase/js/asynctask.js:213
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
@@ -420,11 +420,11 @@ msgstr ""
"dun minuto, por favor, revise a súa conexión a Internet, recargue a páxina e " "dun minuto, por favor, revise a súa conexión a Internet, recargue a páxina e "
"inténteo de novo." "inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:276 #: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:331 #: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message" msgid "Close message"
msgstr "Cerrar mensaxe" msgstr "Cerrar mensaxe"
@@ -791,7 +791,7 @@ msgstr "Obtés %(currency)s %(price)s de volta"
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Por favor, ingrese a cantidade que pode conservar o organizador." msgstr "Por favor, ingrese a cantidade que pode conservar o organizador."
#: pretix/static/pretixpresale/js/ui/main.js:564 #: pretix/static/pretixpresale/js/ui/main.js:554
msgid "Your local time:" msgid "Your local time:"
msgstr "A súa hora local:" msgstr "A súa hora local:"

Some files were not shown because too many files have changed in this diff Show More