Compare commits

...

45 Commits

Author SHA1 Message Date
Richard Schreiber
211804dde7 make parsing more robust 2025-06-13 09:19:24 +02:00
Richard Schreiber
3f3715f80c Control: fix question graphs UI 2025-06-13 09:14:42 +02:00
luelista
b5e20df508 Use proper log entry types for waiting list emails (#5070) (#5219) 2025-06-12 14:03:40 +02:00
Raphael Michel
eba5c1b36d API: Fix crash on distributing a fee over tax rates with zero value (Z#23196669) (#5226) 2025-06-12 14:03:25 +02:00
Raphael Michel
7d30ecf527 API: Add items__in filter for quotas (Z#23195926) (#5232)
* API: Add items__in filter for quotas (Z#23195926)

* Update doc/api/resources/quotas.rst

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2025-06-12 12:24:45 +02:00
Raphael Michel
2359307462 Remove replaced docs 2025-06-12 10:54:28 +02:00
dependabot[bot]
325f7c565d Bump django-localflavor from 4.0 to 5.0 (#5234)
Bumps [django-localflavor](https://github.com/django/django-localflavor) from 4.0 to 5.0.
- [Changelog](https://github.com/django/django-localflavor/blob/master/docs/changelog.rst)
- [Commits](https://github.com/django/django-localflavor/compare/4.0...5.0)

---
updated-dependencies:
- dependency-name: django-localflavor
  dependency-version: '5.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-11 10:57:10 +02:00
luelista
df48adef1b Filter payment method sales channels when cloning event to new organizer (Z#23196085) (#5220) 2025-06-11 10:56:58 +02:00
Richard Schreiber
74cea09f6c [A11y] add missing autcomplete (#5236) 2025-06-11 10:47:17 +02:00
Richard Schreiber
e8abe5cad8 [A11y] fix variations toggle-button missing aria-controls (#5237) 2025-06-11 10:46:53 +02:00
조정화
6c9f66487d Translations: Update Korean
Currently translated at 51.4% (3036 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-06-11 09:40:37 +02:00
조정화
5f828127bf Translations: Update Korean
Currently translated at 49.8% (2943 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-06-11 09:40:37 +02:00
Michael Dao
c5b3093f20 Translations: Update Vietnamese
Currently translated at 89.1% (5261 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-11 09:40:37 +02:00
Richard Schreiber
ae4073b3e4 [A11y] improve cart renew confirmation (#5206)
* [A11y] improve cart renew confirmation

* revert time

* add inline-dialog to cart-renewal-button so confirm-button has interactive meaning
2025-06-11 08:58:26 +02:00
Richard Schreiber
362ac8de6f [A11y] Widget: pass doc title in overlay to iframe.title (#5210) 2025-06-10 20:41:51 +02:00
Richard Schreiber
cced9cd768 Widget: remove role=alertdialog for checkout overlay as it is to obtrusive in NVDA (#5211) 2025-06-10 20:41:23 +02:00
Richard Schreiber
dfb45e13ca [A11y] Widget: make inputs min-height instead of fixed height (#5216) 2025-06-10 20:40:52 +02:00
Richard Schreiber
23489f50f8 [A11y] Widget: change calendar table aria-label to labelledby (#5217) 2025-06-10 20:40:33 +02:00
Richard Schreiber
80148a8435 [A11y] Widget: move dialog-focus to close-button (#5221) 2025-06-10 20:39:43 +02:00
Richard Schreiber
9f49b7747c [A11y] Checkout: fix semantics for addon-list, etc. (#5212) 2025-06-10 20:39:16 +02:00
Richard Schreiber
b75f8bf893 Widget: fix loading spinner not showing on API-request (#5228)
* Widget: fix loading spinner not showing while API-request

* remove not needed showModal as it is handled be frame_loading-watcher

* add double check if dialog is open before closing it
2025-06-10 20:35:11 +02:00
Richard Schreiber
d53af424cf Widget: fix prefill 1 with variation-product (#5229) 2025-06-10 20:34:47 +02:00
Richard Schreiber
24c02751cc Fix phone tel-country-code label and autocomplete (#5227)
* Fix phone tel-country-code label and autocomplete

* Add autocomplete sectioning for MultiWidget
2025-06-10 20:34:08 +02:00
dependabot[bot]
2f7a00e660 Update protobuf requirement from ==6.30.* to ==6.31.* (#5222) 2025-06-10 15:17:32 +02:00
dependabot[bot]
767b01be9a Update pytest requirement from ==8.3.* to ==8.4.* (#5200)
Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.3.0.dev0...8.4.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 8.4.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-10 15:17:20 +02:00
dependabot[bot]
f9acefc0f9 Update pypdf requirement from ==5.4.* to ==5.6.* (#5201) 2025-06-10 15:17:05 +02:00
Tim Maurizio Dullaart
234a3d0db1 Translations: Update Dutch
Currently translated at 100.0% (252 of 252 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/nl/

powered by weblate
2025-06-10 15:09:45 +02:00
Tim Maurizio Dullaart
b7228ff5b8 Translations: Update Dutch
Currently translated at 100.0% (5900 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/nl/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
053c713a2a Translations: Update Vietnamese
Currently translated at 24.5% (1448 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
6959dca7c1 Translations: Update Vietnamese
Currently translated at 23.7% (1404 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
87312c9d8a Translations: Update Vietnamese
Currently translated at 100.0% (252 of 252 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
4b697b9244 Translations: Update Vietnamese
Currently translated at 3.0% (181 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
cc55aba2e6 Translations: Update Vietnamese
Currently translated at 60.3% (152 of 252 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
fbbc6502f3 Translations: Update Vietnamese
Currently translated at 2.6% (156 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Michael Dao
62b3af2197 Translations: Update Vietnamese
Currently translated at 2.5% (150 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2025-06-10 15:09:45 +02:00
Francisco Rosa
177717d594 Translations: Update Portuguese
Currently translated at 7.1% (18 of 252 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/pt/

powered by weblate
2025-06-10 15:09:45 +02:00
Francisco Rosa
2f2991105a Translations: Update Portuguese
Currently translated at 5.2% (309 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt/

powered by weblate
2025-06-10 15:09:45 +02:00
조정화
d03af3ce06 Translations: Update Korean
Currently translated at 97.6% (246 of 252 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ko/

powered by weblate
2025-06-10 15:09:45 +02:00
조정화
6b95bfbc96 Translations: Update Korean
Currently translated at 48.6% (2868 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-06-10 15:09:45 +02:00
Renne Rocha
0f4d5b639d Translations: Update Portuguese (Brazil)
Currently translated at 92.0% (5430 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2025-06-10 15:09:45 +02:00
Anarion Dunedain
53ebee37fe Translations: Update Polish
Currently translated at 99.0% (5846 of 5900 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pl/

powered by weblate
2025-06-10 15:09:45 +02:00
Richard Schreiber
572973b5c0 Remove fade-in for dialogs to remove flickering when showing multiple dialogs in a row (#5208) 2025-06-10 14:12:26 +02:00
Richard Schreiber
ab72abea0a [A11y] add autocomplete to customer forms email input (#5214) 2025-06-10 12:54:25 +02:00
Raphael Michel
c53fc8df4e Developer docs: Remove some ancient history (#5224) 2025-06-10 12:20:41 +02:00
luelista
87fb3d2df8 Event timeline: add direct links, payment provider availability (Z#23195903) (#5209)
* link directly to tabs/fields
* add missing payment provider availability_start dates
2025-06-05 12:59:26 +02:00
63 changed files with 8384 additions and 6583 deletions

View File

@@ -48,11 +48,6 @@ seat objects The assigned se
└ seat_guid string Identifier of the seat within the seating plan
===================================== ========================== =======================================================
.. versionchanged:: 4.14
This ``is_bundled`` attribute has been added and the cart creation endpoints have been updated.
Cart position endpoints
-----------------------

View File

@@ -9,14 +9,6 @@ This page describes special APIs built for ticket scanning apps. For managing ch
please also see :ref:`rest-checkinlists`. The check-in list API also contains endpoints to obtain statistics or log
failed scans.
.. versionchanged:: 4.12
The endpoints listed on this page have been added.
.. versionchanged:: 4.18
The ``source_type`` parameter has been added.
.. _`rest-checkin-redeem`:
Checking a ticket in

View File

@@ -40,10 +40,6 @@ ignore_in_statistics boolean If ``true``, ch
consider_tickets_used boolean If ``true`` (default), tickets checked in on this list will be considered "used" by other functionality, i.e. when checking if they can still be canceled.
===================================== ========================== =======================================================
.. versionchanged:: 4.12
The ``addon_match`` attribute has been added.
.. versionchanged:: 2023.9
The ``ignore_in_statistics`` and ``consider_tickets_used`` attributes have been added.

View File

@@ -34,12 +34,6 @@ password string Can only be set
not be included in any responses.
===================================== ========================== =======================================================
.. versionadded:: 4.0
.. versionchanged:: 4.3
Passwords can now be set through the API during customer creation.
.. versionchanged:: 2024.3
The attribute ``phone`` has been added.

View File

@@ -61,25 +61,6 @@ public_url string The public, cus
Endpoints
---------
.. versionchanged:: 4.0
The ``clone_from`` parameter has been added to the event creation endpoint.
.. versionchanged:: 4.1
The ``with_availability_for`` parameter has been added.
The ``search`` query parameter has been added to filter events by their slug, name, or location in any language.
.. versionchanged:: 4.17
The ``public_url`` field has been added.
.. versionchanged:: 5.0
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
added.
.. http:get:: /api/v1/organizers/(organizer)/events/
Returns a list of all events within a given organizer the authenticated user/token has access to.
@@ -630,10 +611,6 @@ organizer level.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. versionchanged:: 4.18
The ``readonly`` flag has been added.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/settings/
Updates event settings. Note that ``PUT`` is not allowed here, only ``PATCH``.

View File

@@ -47,11 +47,6 @@ acceptor string Organizer slug
this field was added.)
===================================== ========================== =======================================================
.. versionchanged:: 4.20
The ``owner_ticket`` and ``issuer`` attributes of the gift card and the ``info`` and ``acceptor`` attributes of the
gift card transaction resource have been added.
Endpoints
---------

View File

@@ -111,18 +111,6 @@ internal_reference string Customer's refe
===================================== ========================== =======================================================
.. versionchanged:: 4.1
The attributes ``fee_type`` and ``fee_internal_type`` have been added.
.. versionchanged:: 4.1
The attribute ``lines.event_location`` has been added.
.. versionchanged:: 4.6
The attribute ``lines.subevent`` has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.

View File

@@ -64,10 +64,6 @@ hide_without_voucher boolean If ``true``, th
meta_data object Values set for event-specific meta data parameters.
===================================== ========================== =======================================================
.. versionchanged:: 4.16
The ``meta_data`` and ``checkin_attention`` attributes have been added.
.. versionchanged:: 2023.10
The ``free_price_suggestion`` attribute has been added.

View File

@@ -211,28 +211,6 @@ bundles list of objects Definition of
meta_data object Values set for event-specific meta data parameters.
======================================= ========================== =======================================================
.. versionchanged:: 4.0
The attributes ``require_membership``, ``require_membership_types``, ``grant_membership_type``, ``grant_membership_duration_like_event``,
``grant_membership_duration_days`` and ``grant_membership_duration_months`` have been added.
.. versionchanged:: 4.4
The attributes ``require_membership_hidden`` attribute has been added.
.. versionchanged:: 4.16
The ``variations[x].meta_data`` and ``variations[x].checkin_attention`` attributes have been added.
The ``personalized`` attribute has been added.
.. versionchanged:: 4.17
The ``validity_*`` attributes have been added.
.. versionchanged:: 4.18
The ``media_policy`` and ``media_type`` attributes have been added.
.. versionchanged:: 2023.10
The ``checkin_text`` and ``variations[x].checkin_text`` attributes have been added.

View File

@@ -114,34 +114,6 @@ plugin_data object Additional data
===================================== ========================== =======================================================
.. versionchanged:: 4.0
The ``customer`` attribute has been added.
.. versionchanged:: 4.1
The ``custom_followup_at`` attribute has been added.
.. versionchanged:: 4.4
The ``item`` and ``variation`` query parameters have been added.
.. versionchanged:: 4.6
The ``subevent`` query parameters has been added.
.. versionchanged:: 4.8
The ``order.fees.id`` attribute has been added.
.. versionchanged:: 4.15
The ``include`` query parameter has been added.
.. versionchanged:: 4.16
The ``valid_if_pending`` attribute has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.
@@ -260,10 +232,6 @@ pdf_data object Data object req
plugin_data object Additional data added by plugins.
===================================== ========================== =======================================================
.. versionchanged:: 4.16
The attributes ``blocked``, ``valid_from`` and ``valid_until`` have been added.
.. versionchanged:: 2024.9
The attribute ``print_logs`` has been added.
@@ -756,10 +724,6 @@ Fetching individual orders
Order ticket download
---------------------
.. versionchanged:: 4.10
The API now supports ticket downloads for pending orders if allowed by the event settings.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/download/(output)/
Download tickets for an order, identified by its order code. Depending on the chosen output, the response might
@@ -1095,9 +1059,10 @@ Creating orders
prices. Note that this will not include other fees and is calculated once during order generation and will not
be respected automatically when the order changes later.)
* ``_split_taxes_like_products`` (Optional convenience flag. If set to ``true``, your ``tax_rule`` will be ignored
and the fee will be taxed like the products in the order. If the products have multiple tax rates, multiple fees
will be generated with weights adjusted to the net price of the products. Note that this will be calculated once
during order generation and is not respected automatically when the order changes later.)
and the fee will be taxed like the products in the order *unless* the total amount of the positions is zero.
If the products have multiple tax rates, multiple fees will be generated with weights adjusted to the net price
of the products. Note that this will be calculated once during order generation and is not respected automatically
when the order changes later.)
* ``force`` (optional). If set to ``true``, quotas will be ignored.
* ``send_email`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of
@@ -1832,10 +1797,6 @@ Fetching individual positions
Order position ticket download
------------------------------
.. versionchanged:: 4.10
The API now supports ticket downloads for pending orders if allowed by the event settings.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/(id)/download/(output)/
Download tickets for one order position, identified by its internal ID.
@@ -1888,15 +1849,6 @@ Order position ticket download
Manipulating individual positions
---------------------------------
.. versionchanged:: 4.8
The ``PATCH`` method now supports changing items, variations, subevents, seats, prices, and tax rules.
The ``POST`` endpoint to add individual positions has been added.
.. versionadded:: 4.16
The endpoints to manage blocks have been added.
.. versionchanged:: 2024.9
The API now supports logging ticket and badge prints.
@@ -2226,10 +2178,6 @@ multiple changes to an order at once within one transaction. This makes it possi
attendees in an order without running into conflicts. This interface also offers some possibilities not available
otherwise, such as splitting an order or changing fees.
.. versionchanged:: 4.8
This endpoint has been added to the system.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/change/
Performs a change operation on an order. You can supply the following fields:

View File

@@ -25,10 +25,6 @@ public_url string The public, cus
Endpoints
---------
.. versionchanged:: 4.17
The ``public_url`` field has been added.
.. http:get:: /api/v1/organizers/
Returns a list of all organizers the authenticated user/token has access to.

View File

@@ -36,11 +36,6 @@ available_number integer Number of avail
slightly out of date. ``null`` means unlimited.
===================================== ========================== =======================================================
.. versionchanged:: 4.1
The ``with_availability`` query parameter has been added.
Endpoints
---------
@@ -86,7 +81,8 @@ Endpoints
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
Default: ``position``
:query integer subevent: Only return quotas of the sub-event with the given ID.
:query integer subevent__in: Only return quotas of sub-events with one the given IDs (comma-separated).
:query integer subevent__in: Only return quotas of sub-events with one of the given IDs (comma-separated).
:query integer items__in: Only return quotas that include a product with one of the given IDs (comma-separated).
:query string with_availability: Set to ``true`` to get availability information. Can lead to increased answer times.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch

View File

@@ -6,10 +6,6 @@ Data shredders
pretix and it's plugins include a number of data shredders that allow you to clear personal information from the system.
This page shows you how to use these shredders through the API.
.. versionchanged:: 4.12
This feature has been added to the API.
.. warning::
Unlike the user interface, the API will not force you to download tax-relevant data before you delete it.

View File

@@ -59,15 +59,6 @@ seat_category_mapping object An object mappi
last_modified datetime Last modification of this object
===================================== ========================== =======================================================
.. versionchanged:: 4.15
The ``search`` query parameter has been added to filter sub-events by their name or location in any language.
.. versionchanged:: 5.0
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
added.
.. versionchanged:: 2023.8.0
For the organizer-wide endpoint, the ``search`` query parameter has been modified to filter sub-events by their parent events slug too.
@@ -75,10 +66,6 @@ last_modified datetime Last modificati
Endpoints
---------
.. versionchanged:: 4.1
The ``with_availability_for`` parameter has been added.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
Returns a list of all sub-events of an event.

View File

@@ -40,10 +40,6 @@ custom_rules object Dynamic rules s
===================================== ========================== =======================================================
.. versionchanged:: 4.6
The ``internal_name`` and ``keep_gross_if_rate_changes`` attributes have been added.
.. versionchanged:: 2023.6
The ``custom_rules`` attribute has been added.

View File

@@ -39,10 +39,6 @@ can_change_vouchers boolean
can_checkin_orders boolean
===================================== ========================== =======================================================
.. versionchanged:: 4.18
The ``can_manage_reusable_media`` permission has been added.
Team member resource
--------------------

View File

@@ -178,13 +178,6 @@ You can then implement a view as you would normally do. It will be automatically
* Your plugin is enabled
* The locale is set correctly
.. versionchanged:: 1.7
The ``event_url()`` wrapper has been added in 1.7 to replace the former ``@event_view`` decorator. The
``event_url()`` wrapper is optional and using ``url()`` still works, but you will not be able to set the
``require_live`` setting any more via the decorator. The ``@event_view`` decorator is now deprecated and
does nothing.
REST API viewsets
-----------------

View File

@@ -10,7 +10,6 @@ Contents:
exporter
ticketoutput
payment
payment_2.0
email
placeholder
invoice

View File

@@ -1,129 +0,0 @@
.. highlight:: python
:linenothreshold: 5
.. _`payment2.0`:
Porting a payment provider from pretix 1.x to pretix 2.x
========================================================
In pretix 2.x, we changed large parts of the payment provider API. This documentation details the changes we made
and shows you how you can make an existing pretix 1.x payment provider compatible with pretix 2.x
Conceptual overview
-------------------
In pretix 1.x, an order was always directly connected to a payment provider for the full life of an order. As long as
an order was unpaid, this could still be changed in some cases, but once an order was paid, no changes to the payment
provider were possible any more. Additionally, the internal state of orders allowed orders only to be fully paid or
not paid at all. This leads to a couple of consequences:
* Payment-related functions (like "execute payment" or "do a refund") always operated on full orders.
* Changing the total of an order was basically impossible once an order was paid, since there was no concept of
partial payments or partial refunds.
* Payment provider plugins needed to take complicated steps to detect cases that require human intervention, like e.g.
* An order has expired, no quota is left to revive it, but a payment has been received
* A payment has been received for a canceled order
* A payment has been received for an order that has already been paid with a different payment method
* An external payment service notified us of a refund/dispute
We noticed that we copied and repeated large portions of code in all our official payment provider plugins, just
to deal with some of these cases.
* Sometimes, there is the need to mark an order as refunded within pretix, without automatically triggering a refund
with an external API. Every payment method needed to implement a user interface for this independently.
* If a refund was not possible automatically, there was no way user to track which payments actually have been refunded
manually and which are still left to do.
* When the payment with one payment provider failed and the user changed to a different payment provider, all
information about the first payment was lost from the order object and could only be retrieved from order log data,
which also made it hard to design a data shredder API to get rid of this data.
In pretix 2.x, we introduced two new models, :py:class:`OrderPayment <pretix.base.models.OrderPayment>` and
:py:class:`OrderRefund <pretix.base.models.OrderRefund>`. Each instance of these is connected to an order and
represents one single attempt to pay or refund a specific amount of money. Each one of these has an individual state,
can individually fail or succeed, and carries an amount variable that can differ from the order total.
This has the following advantages:
* The system can now detect orders that are over- or underpaid, independent of the payment providers in use.
* Therefore, we can now allow partial payments, partial refunds, and changing paid orders, and automatically detect
the cases listed above and notify the user.
Payment providers now interact with those payment and refund objects more than with orders.
Your to-do list
---------------
Payment processing
""""""""""""""""""
* The method ``BasePaymentProvider.order_pending_render`` has been removed and replaced by a new
``BasePaymentProvider.payment_pending_render(request, payment)`` method that is passed an ``OrderPayment``
object instead of an ``Order``.
* The method ``BasePaymentProvider.payment_form_render`` now receives a new ``total`` parameter.
* The method ``BasePaymentProvider.payment_perform`` has been removed and replaced by a new method
``BasePaymentProvider.execute_payment(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* The function ``pretix.base.services.mark_order_paid`` has been removed, instead call ``payment.confirm()``
on a pending ``OrderPayment`` object. If no further payments are required for this order, this will also
mark the order as paid automatically. Note that ``payment.confirm()`` can still throw a ``QuotaExceededException``,
however it will still mark the payment as complete (not the order!), so you should catch this exception and
inform the user, but not abort the transaction.
* A new property ``BasePaymentProvider.abort_pending_allowed`` has been introduced. Only if set, the user will
be able to retry a payment or switch the payment method when the order currently has a payment object in
state ``"pending"``. This replaces ``BasePaymentProvider.order_can_retry``, which no longer exists.
* The methods ``BasePaymentProvider.retry_prepare`` and ``BasePaymentProvider.order_prepare`` have both been
replaced by a new method ``BasePaymentProvider.payment_prepare(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``. **Keep in mind that this payment object might have an amount property that
differs from the order total, if the order is already partially paid.**
* The method ``BasePaymentProvider.order_paid_render`` has been removed.
* The method ``BasePaymentProvider.order_control_render`` has been removed and replaced by a new method
``BasePaymentProvider.payment_control_render(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* There's no need to manually deal with excess payments or duplicate payments anymore, just setting the ``OrderPayment``
methods to the correct state will do the job.
Creating refunds
""""""""""""""""
* The methods ``BasePaymentProvider.order_control_refund_render`` and ``BasePaymentProvider.order_control_refund_perform``
have been removed.
* Two new boolean methods ``BasePaymentProvider.payment_refund_supported(payment)`` and ``BasePaymentProvider.payment_partial_refund_supported(payment)``
have been introduced. They should be set to return ``True`` if and only if the payment API allows to *automatically*
transfer the money back to the customer.
* A new method ``BasePaymentProvider.execute_refund(refund)`` has been introduced. This method is called using a
``OrderRefund`` object in ``"created"`` state and is expected to transfer the money back and confirm success with
calling ``refund.done()``. This will only ever be called if either ``BasePaymentProvider.payment_refund_supported(payment)``
or ``BasePaymentProvider.payment_partial_refund_supported(payment)`` return ``True``.
Processing external refunds
"""""""""""""""""""""""""""
* If e.g. a webhook API notifies you that a payment has been disputed or refunded with the external API, you are
expected to call ``OrderPayment.create_external_refund(self, amount, execution_date, info='{}')`` on this payment.
This will create and return an appropriate ``OrderRefund`` object and send out a notification. However, it will not
mark the order as refunded, but will ask the event organizer for a decision.
Data shredders
""""""""""""""
* The method ``BasePaymentProvider.shred_payment_info`` is no longer passed an order, but instead **either**
an ``OrderPayment`` **or** an ``OrderRefund``.

View File

@@ -1,177 +0,0 @@
.. spelling:word-list::
AGPL
AGPLv3
GPL
LGPL
Apache
BSD
MIT
CLA
django
i18nfields
hierarkey
rami.io
rami
io
GmbH
License FAQ
===========
.. warning::
This FAQ tries to explain in simpler terms what the license of the pretix open source project does and does not
allow. It is based on our interpretation of the license and is not legal advice. The contents of this page are not
legally binding, only the original text of the license in the `license file`_ is legally binding.
How is pretix licensed?
-----------------------
pretix follows the popular dual licensing model. It is available under the `GNU Affero General Public License 3`_ (AGPL)
plus some additional terms, as well as under a proprietary license ("pretix Enterprise license") on request.
How can it be AGPL if there are additional terms?
-------------------------------------------------
Even though it is fairly unknown, the AGPL's section 7 is titled "Additional Terms" and outlines specific conditions
under which additional terms can be imposed on an AGPL-licensed work. In our case, we add three additional terms.
The first additional term for pretix is an additional **permission**. It allows you to do something that the AGPL would
generally not allow. As it doesn't restrict your freedoms granted by AGPL, if you don't like it, you can ignore it, and
if you distribute pretix further, you can remove it.
The second and third additional term for pretix are additional terms that restrict or specify other provisions of the
license. AGPL specifically requires that these terms can only restrict or specify very specific things and we believe
our additional terms are in compliance with that and are thus valid and may not be removed.
Why did you choose this license model?
--------------------------------------
pretix was born in the open source community and we're deeply committed to building the best open source ticketing
solution in the world. It is important to us that pretix is available with a comprehensive feature set under term that
are compatible with the `Open Source Definition`_. This enables event organizers from all industries and regions
to have access to a self-hosted, privacy-friendly and secure option to host their events.
However, developing and maintaining pretix is a lot of work. Between 2014 and 2021, we've received external
contributions from more than 150 individuals. Not counting translations over 90 % of the development was
done by staff engineers of rami.io GmbH, the company that started pretix. While we're very happy to receive many more
contributions in the future, we also want to ensure that we continue to be able to pay people working on pretix
full-time.
We believe our model creates a good balance between ensuring pretix is available freely as well as protecting our
business interests. Unlike licenses chosen by other projects recently, such as the Server-Side Public License, our
choice does not restrict using pretix for any possible use case, it just sets a few rules that you have to play by
if you do.
What do I need to do if I use pretix unmodified?
------------------------------------------------
If you use pretix without any modifications or plugins, you can use it for whatever you want, as long as you keep
all copyright notices (including the link to pretix at the bottom of the site) intact.
You are also allowed to make copies of the unmodified source code and distribute them to others as long as you keep
all copyright and license information intact.
If you install **plugins**, you must follow the same terms as when using a **modified** version (see below).
What do I need to do if I modify pretix?
----------------------------------------
If you want to modify pretix, you have the right to do so. However, you need to follow the following rules:
* If you **run it for your own events** (events run by you or your company as well as companies from the same
corporate groups) our additional permission allows you to do so **without needing to share your source code
modifications** as long as you keep the link to pretix at the bottom of the site intact.
* If you **run it for others**, for example as part of a Software-as-a-Service offering or a managed hosting service
you **must** make the source code **including all your modifications and all installed plugins** available under the
same license as pretix to every visitor of your site. You need to do so in a prominent place such as a link at the bottom of the
site. You also **must** keep the existing link intact.
You **may not** add additional restrictions on the result as a whole. You **may** add additional permissions, but
only on the parts you added. You **must** make clear which changes you made and you must not give the impression that
your modified version is an official version of pretix.
* If you **distribute** the modified version, for example as a source code or software package, you **must** license it
under the AGPL license with the same additional terms. You **may not** add additional restrictions on the result as a
whole. You **may** add additional permissions, but only on the parts you added. You **must** make clear which changes
you made and you must not give the impression that your modified version is an official version of pretix.
Does the AGPL copyleft mechanism extend to plugins?
---------------------------------------------------
Yes. pretix plugins are tightly integrated with pretix, so when running pretix together with a plugin in the same
environment they form a `combined work`_ and the copyleft mechanism of AGPL applies.
Can I create proprietary or secret plugins?
-------------------------------------------
Yes, you can create a proprietary or secret plugin, but it may only ever be **used** in an environment that is covered
by the additional permission from our license. As soon as the plugin is installed in an installation that is not covered
by our additional permission (e.g. when it is used in a SaaS environment) or covered by an active pretix Enterprise
license it **must** be released to the visitors of the site under the same license as pretix (like a modified version
of pretix).
What licenses can plugins use?
------------------------------
Technically, you can distribute a plugin under any free or proprietary license as long as it is distributed separately.
However, once it is either **distributed together with pretix or used in an environment not covered by our
additional permission** or an active pretix Enterprise license, you **must** release it to all recipients of the
distribution or all visitors of your site under the same license as pretix (like a modified version of pretix).
If you release a plugin publicly, it is therefore most practical to use a license that is `compatible to AGPL`_.
This includes most open source licenses such as AGPL, GPL, Apache, 3-clause BSD or MIT.
Note however that when you license a plugin with pure AGPL, it will be incompatible with our additional permission.
Therefore, if you want to use an AGPL-licensed plugin, you'll need to publish the source code of **all** your plugins
under AGPL terms **even if you only use it for your own events**. A plugin would add its `own additional permission`_
to its license to allow combining it with pretix for this use case.
To make things less complicated, if you want to distribute a plugin freely, we therefore recommend distributing the
plugin under **Apache License 2.0**, like we do for most plugins we distribute as open source.
What do I need to do if I want to contribute my changes back?
-------------------------------------------------------------
In order to retain the possibility for us to offer pretix in a dual licensing model, we unfortunately need you to sign
a Contributor License Agreement (CLA) that gives us permission to use your contribution in all present and future
distributions of pretix. We know the bureaucracy sucks. Sorry.
What if I want to re-use a minor part of pretix in my project?
--------------------------------------------------------------
This is the main part we dislike about AGPL: If you see a specific thing in pretix that you'd like to use in another
project, you'll need to distribute your other project under AGPL terms as well which is often not practical.
In this case, feel free to get in touch with us! We're happy to grant you special permission or pull the component
out into a separately, permissively licensed repository. We already did that with `django-hierarkey`_ and
`django-i18nfield`_ which have previously been parts of pretix.
What can I use the name "pretix" for?
-------------------------------------
The name pretix is a registered trademark by rami.io GmbH.
* You **may** use it to **indicate copyright**, such as in the "powered by pretix" or "based on pretix" line, or when
indicating that a distribution is based on pretix.
* You **may** use it to **indicate compatibility**, for example you are allowed to name your plugin "<name> for pretix"
or you may state that an external service is compatible with pretix.
* You **may not** give the impression that your modified version, plugin or compatible service is official or authorized
by rami.io GmbH or pretix unless we specifically allowed you to do so.
* You **may not** use it to name your modified version of pretix. End-users must be able to easily identify whether
a version of pretix is distributed by us.
* You **may not** use any variations of the name, such as "MyPretix".
.. _license file: https://github.com/pretix/pretix/blob/master/LICENSE
.. _GNU Affero General Public License 3: https://www.gnu.org/licenses/agpl-3.0.en.html
.. _compatible to AGPL: https://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses
.. _Open Source Definition: https://opensource.org/osd
.. _combined work: https://www.gnu.org/licenses/gpl-faq.html#GPLPlugins
.. _own additional permission: https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs
.. _django-hierarkey: https://github.com/raphaelm/django-hierarkey
.. _django-i18nfield: https://github.com/raphaelm/django-i18nfield

View File

@@ -46,7 +46,7 @@ dependencies = [
"django-hijack==3.7.*",
"django-i18nfield==1.10.*",
"django-libsass==0.9",
"django-localflavor==4.0",
"django-localflavor==5.0",
"django-markup",
"django-oauth-toolkit==2.3.*",
"django-otp==1.6.*",
@@ -76,12 +76,12 @@ dependencies = [
"phonenumberslite==9.0.*",
"Pillow==11.2.*",
"pretix-plugin-build",
"protobuf==6.30.*",
"protobuf==6.31.*",
"psycopg2-binary",
"pycountry",
"pycparser==2.22",
"pycryptodome==3.23.*",
"pypdf==5.4.*",
"pypdf==5.6.*",
"python-bidi==0.6.*", # Support for Arabic in reportlab
"python-dateutil==2.9.*",
"pytz",
@@ -123,7 +123,7 @@ dev = [
"pytest-mock==3.14.*",
"pytest-sugar",
"pytest-xdist==3.7.*",
"pytest==8.3.*",
"pytest==8.4.*",
"responses",
]

View File

@@ -1600,7 +1600,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
self.context['event'].currency)
is_split_taxes = fee_data.pop('_split_taxes_like_products', False)
if is_split_taxes:
if is_split_taxes and order.total:
d = defaultdict(lambda: Decimal('0.00'))
trz = TaxRule.zero()
for p in pos_map.values():

View File

@@ -485,8 +485,17 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
super().perform_destroy(instance)
class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
pass
with scopes_disabled():
class QuotaFilter(FilterSet):
items__in = NumberInFilter(
field_name='items__id',
lookup_expr='in',
)
class Meta:
model = Quota
fields = {
@@ -508,7 +517,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
return self.request.event.quotas.all()
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = self.filter_queryset(self.get_queryset()).distinct()
page = self.paginate_queryset(queryset)

View File

@@ -308,7 +308,10 @@ class WrappedPhonePrefixSelect(Select):
self.initial = "+%d" % prefix
break
choices += get_phone_prefixes_sorted_and_localized()
super().__init__(choices=choices, attrs={'aria-label': pgettext_lazy('phonenumber', 'International area code')})
super().__init__(choices=choices, attrs={
'aria-label': pgettext_lazy('phonenumber', 'International area code'),
'autocomplete': 'tel-country-code',
})
def render(self, name, value, *args, **kwargs):
return super().render(name, value or self.initial, *args, **kwargs)
@@ -331,11 +334,11 @@ class WrappedPhonePrefixSelect(Select):
class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget):
def __init__(self, attrs=None, initial=None):
attrs = {
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)')
}
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs=attrs))
super(PhoneNumberPrefixWidget, self).__init__(widgets, attrs)
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs={
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)'),
'autocomplete': 'tel-national',
}))
super(PhoneNumberPrefixWidget, self).__init__(widgets)
def render(self, name, value, attrs=None, renderer=None):
output = super().render(name, value, attrs, renderer)
@@ -992,6 +995,13 @@ class BaseQuestionsForm(forms.Form):
value.initial = data.get('question_form_data', {}).get(key)
for k, v in self.fields.items():
if isinstance(v.widget, forms.MultiWidget):
for w in v.widget.widgets:
autocomplete = w.attrs.get('autocomplete', '')
if autocomplete.strip() == "off":
w.attrs['autocomplete'] = 'off'
else:
w.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + autocomplete
if v.widget.attrs.get('autocomplete') or k == 'attendee_name_parts':
autocomplete = v.widget.attrs.get('autocomplete', '')
if autocomplete.strip() == "off":

View File

@@ -26,7 +26,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models import (
Discount, Item, ItemCategory, Order, Question, Quota, SubEvent, TaxRule,
Voucher,
Voucher, WaitingListEntry,
)
from .logentrytype_registry import ( # noqa
@@ -145,3 +145,15 @@ class TaxRuleLogEntryType(EventLogEntryType):
object_link_viewname = 'control:event.settings.tax.edit'
object_link_argname = 'rule'
content_type = TaxRule
class WaitingListEntryLogEntryType(EventLogEntryType):
object_link_wrapper = _('{val}')
object_link_viewname = 'control:event.orders.waitinglist'
content_type = WaitingListEntry
def get_object_link_info(self, logentry) -> Optional[dict]:
info = super().get_object_link_info(logentry)
if info and 'href' in info:
info['href'] += '?status=a&entry=' + str(logentry.content_object.pk)
return info

View File

@@ -1084,6 +1084,7 @@ class Event(EventMixin, LoggedModel):
s.product = item_map[s.product_id]
s.save(force_insert=True)
valid_sales_channel_identifers = set(self.organizer.sales_channels.values_list("identifier", flat=True))
skip_settings = (
'ticket_secrets_pretix_sig1_pubkey',
'ticket_secrets_pretix_sig1_privkey',
@@ -1119,6 +1120,11 @@ class Event(EventMixin, LoggedModel):
settings_to_save.append(s)
except ValueError:
pass
elif s.key.startswith('payment_') and s.key.endswith('__restrict_to_sales_channels'):
data = other.settings._unserialize(s.value, as_type=list)
data = [ident for ident in data if ident in valid_sales_channel_identifers]
s.value = other.settings._serialize(data)
settings_to_save.append(s)
else:
settings_to_save.append(s)
other.settings._objects.bulk_create(settings_to_save)

View File

@@ -218,7 +218,6 @@ class WaitingListEntry(LoggedModel):
'waitinglistentry': self.pk,
'subevent': self.subevent.pk if self.subevent else None,
}, user=user, auth=auth)
self.log_action('pretix.event.orders.waitinglist.voucher_assigned', user=user, auth=auth)
self.voucher = v
self.save()
@@ -234,6 +233,7 @@ class WaitingListEntry(LoggedModel):
),
user=user,
auth=auth,
log_entry_type='pretix.event.orders.waitinglist.voucher_assigned',
)
def send_mail(self, subject: Union[str, LazyI18nString], template: Union[str, LazyI18nString],

View File

@@ -689,11 +689,6 @@ class BasePaymentProvider:
the ``_restrict_countries`` and ``_restrict_to_sales_channels`` setting.
:param total: The total value without the payment method fee, after taxes.
.. versionchanged:: 1.17.0
The ``total`` parameter has been added. For backwards compatibility, this method is called again
without this parameter if it raises a ``TypeError`` on first try.
"""
timing = self._is_available_by_time(cart_id=get_or_create_cart_id(request))
pricing = True

View File

@@ -58,7 +58,7 @@ def timeline_for_event(event, subevent=None):
event=event, subevent=subevent,
datetime=ev.date_from,
description=pgettext_lazy('timeline', 'Your event starts'),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_date_from_0'
))
if ev.date_to:
@@ -66,7 +66,7 @@ def timeline_for_event(event, subevent=None):
event=event, subevent=subevent,
datetime=ev.date_to,
description=pgettext_lazy('timeline', 'Your event ends'),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_date_to_0'
))
if ev.date_admission:
@@ -74,7 +74,7 @@ def timeline_for_event(event, subevent=None):
event=event, subevent=subevent,
datetime=ev.date_admission,
description=pgettext_lazy('timeline', 'Admissions for your event start'),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_date_admission_0'
))
if ev.presale_start:
@@ -82,7 +82,7 @@ def timeline_for_event(event, subevent=None):
event=event, subevent=subevent,
datetime=ev.presale_start,
description=pgettext_lazy('timeline', 'Start of ticket sales'),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_presale_start_0'
))
tl.append(TimelineEvent(
@@ -95,7 +95,7 @@ def timeline_for_event(event, subevent=None):
pgettext_lazy('timeline', 'End of ticket sales'),
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured') if not ev.presale_end else ""
),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_presale_end_0'
))
rd = event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper)
@@ -104,7 +104,7 @@ def timeline_for_event(event, subevent=None):
event=event, subevent=subevent,
datetime=rd.datetime(ev),
description=pgettext_lazy('timeline', 'Customers can no longer modify their order information'),
edit_url=ev_edit_url
edit_url=ev_edit_url + '#id_settings-last_order_modification_date_0_0'
))
rd = event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
@@ -281,7 +281,7 @@ def timeline_for_event(event, subevent=None):
'event': event.slug,
'organizer': event.organizer.slug,
'item': p.pk,
})
}) + '#id_available_from_0'
))
if p.available_until:
tl.append(TimelineEvent(
@@ -292,7 +292,7 @@ def timeline_for_event(event, subevent=None):
'event': event.slug,
'organizer': event.organizer.slug,
'item': p.pk,
})
}) + '#id_available_until_0'
))
for v in ItemVariation.objects.filter(
@@ -311,7 +311,7 @@ def timeline_for_event(event, subevent=None):
'event': event.slug,
'organizer': event.organizer.slug,
'item': v.item.pk,
})
}) + '#tab-0-3-open'
))
if v.available_until:
tl.append(TimelineEvent(
@@ -325,7 +325,7 @@ def timeline_for_event(event, subevent=None):
'event': event.slug,
'organizer': event.organizer.slug,
'item': v.item.pk,
})
}) + '#tab-0-3-open'
))
pprovs = event.get_payment_providers()
@@ -339,6 +339,24 @@ def timeline_for_event(event, subevent=None):
continue
except:
pass
availability_start = pprov.settings.get('_availability_start', as_type=RelativeDateWrapper)
if availability_start:
d = make_aware(datetime.combine(
availability_start.date(ev),
time(hour=0, minute=0, second=0)
), event.timezone)
tl.append(TimelineEvent(
event=event, subevent=subevent,
datetime=d,
description=pgettext_lazy('timeline', 'Payment provider "{name}" becomes active').format(
name=str(pprov.verbose_name)
),
edit_url=reverse('control:event.settings.payment.provider', kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
'provider': pprov.identifier,
})
))
availability_date = pprov.settings.get('_availability_date', as_type=RelativeDateWrapper)
if availability_date:
d = make_aware(datetime.combine(

View File

@@ -50,7 +50,7 @@ from pretix.base.logentrytypes import (
DiscountLogEntryType, EventLogEntryType, ItemCategoryLogEntryType,
ItemLogEntryType, LogEntryType, OrderLogEntryType, QuestionLogEntryType,
QuotaLogEntryType, TaxRuleLogEntryType, VoucherLogEntryType,
log_entry_types,
WaitingListEntryLogEntryType, log_entry_types,
)
from pretix.base.models import (
Checkin, CheckinList, Event, ItemVariation, LogEntry, OrderPosition,
@@ -697,11 +697,7 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
'the last request was less than 24 hours ago.'),
'pretix.organizer.deleted': _('The organizer "{name}" has been deleted.'),
'pretix.waitinglist.voucher': _('A voucher has been sent to a person on the waiting list.'), # legacy
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
'pretix.event.order.waitinglist.transferred': _('An entry has been transferred to another waiting list.'), # legacy
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
'pretix.team.created': _('The team has been created.'),
'pretix.team.changed': _('The team settings have been changed.'),
'pretix.team.deleted': _('The team has been deleted.'),
@@ -903,3 +899,13 @@ class LegacyCheckinLogEntryType(OrderLogEntryType):
datetime=dt_formatted,
list=checkin_list
)
@log_entry_types.new_from_dict({
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
})
class CoreWaitingListEntryLogEntryType(WaitingListEntryLogEntryType):
pass

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
"Last-Translator: 조정화 <junghwa.jo@om.org>\n"
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix-js/"
"ko/>\n"
@@ -733,7 +733,7 @@ msgstr "카트가 만료되었습니다"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr ""
msgstr "카트가 곧 만료됩니다."
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -764,11 +764,11 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr ""
msgstr "예약 기간을 갱신하시겠습니까?"
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr ""
msgstr "예약 갱신"
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -811,12 +811,13 @@ msgstr "수량 증가"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr ""
msgstr "이벤트를 걸러내다(이벤트 중에서 특정 조건에 맞는 것만 골라서 보여주거나, "
"나머지를 숨기는 것을 의미)"
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr ""
msgstr "걸러내다(데이터나 목록, 정보에서 조건에 맞는 것만 보여주기라는 의미)"
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1075,7 +1076,7 @@ msgstr "체크아웃 재개"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
msgstr "이 작업은 취소할 수 없습니다. 로딩이 끝날 때까지 기다려 주세요"
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
">\n"
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.1\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -88,7 +88,7 @@ msgstr "Grieks"
#: pretix/_base_settings.py:104
msgid "Hebrew"
msgstr ""
msgstr "Hebreeuws"
#: pretix/_base_settings.py:105
msgid "Indonesian"
@@ -694,16 +694,16 @@ msgstr ""
"gebruikt worden door integraties."
#: pretix/base/context.py:38
#, fuzzy, python-brace-format
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
#, python-brace-format
msgid "<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>"
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
msgstr ""
"<a {a_name_attr}>mogelijk gemaakt door {name}</a> <a {a_attr}> gebaseerd op "
"pretix</a>"
#: pretix/base/context.py:48
#, fuzzy, python-brace-format
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
#, python-brace-format
msgid "<a {a_attr}>powered by {name} based on pretix</a>"
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
msgstr "<a {a_attr}>medemogelijk gemaakt door {name} gebasseerd op pretix</a>"
#: pretix/base/context.py:55
#, python-format
@@ -4362,13 +4362,15 @@ msgstr "Optioneel. Er worden geen producten verkocht vóór deze datum."
#: pretix/base/models/event.py:621
msgid "This event is remote or partially remote."
msgstr ""
msgstr "Dit evenement is afgelegen of gedeeltelijk afgelegen."
#: pretix/base/models/event.py:622
msgid ""
"This will be used to let users know if the event is in a different timezone "
"and lets us calculate users local times."
msgstr ""
"Dit wordt gebruikt om gebruikers te laten weten of het evenement in een "
"andere tijdzone is en laat het ons de gebruikers lokale tijdzone berekenen."
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
msgid "Plugins"
@@ -6064,10 +6066,8 @@ msgid "Cart ID (e.g. session key)"
msgstr "Winkelwagen-ID (bijv. sessiesleutel)"
#: pretix/base/models/orders.py:3102
#, fuzzy
#| msgid "Gift card: Expiration date"
msgid "Limit for extending expiration date"
msgstr "Cadeaubon: Verloopdatum"
msgstr "Limiet voor het uitstellen van de vervaldatum"
#: pretix/base/models/orders.py:3131
msgid "Cart position"
@@ -7262,10 +7262,8 @@ msgid "You cannot pay with gift cards when buying a gift card."
msgstr "U kunt niet met cadeaubonnen betalen wanneer u een cadeaubon koopt."
#: pretix/base/payment.py:1467
#, fuzzy
#| msgid "Please enter the correct result."
msgid "Please enter the code of your gift card."
msgstr "Vul alstublieft het correcte resultaat in."
msgstr "Vul alstublieft de code van jouw cadeaukaart in."
#: pretix/base/payment.py:1483 pretix/base/payment.py:1526
msgid ""
@@ -10658,22 +10656,16 @@ msgstr ""
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "Accountinformatie"
msgstr "Toegankelijkheids informatie URL"
#: pretix/base/settings.py:2072
#, fuzzy
#| msgid ""
#| "This should point e.g. to a part of your website that explains how you "
#| "use data gathered in your ticket shop."
msgid ""
"This should point e.g. to a part of your website that explains how your "
"ticket shop complies with accessibility regulation."
msgstr ""
"Dit zou bijvoorbeeld naar een deel van uw website moeten wijzen dat uitlegt "
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
"hoe uw ticketwinkel omgaat met de toegankelijkheids wetgevingen."
#: pretix/base/settings.py:2079
#: pretix/presale/templates/pretixpresale/event/base.html:228
@@ -10681,22 +10673,16 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information"
msgstr "Accountinformatie"
msgstr "Toegankelijkheids informatie"
#: pretix/base/settings.py:2083
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information title"
msgstr "Accountinformatie"
msgstr "Toegankelijkheids informatie titel"
#: pretix/base/settings.py:2093
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information text"
msgstr "Accountinformatie"
msgstr "Toegankelijkheids informatie tekst"
#: pretix/base/settings.py:2114
msgid "Attach ticket files"
@@ -17767,7 +17753,9 @@ msgstr "draaiend in ontwikkelmodus"
#: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Neem contact met ons op als dit langer dan een aantal minuten duurt."
msgstr ""
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
"ons op."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
@@ -21253,13 +21241,11 @@ msgstr "Product met varianten"
#: pretix/control/templates/pretixcontrol/items/index.html:118
msgctxt "subevent"
msgid "Product assigned to seating plan for one or more dates"
msgstr ""
msgstr "Product toegewezen tot een zittingsschema voor een of meerdere data"
#: pretix/control/templates/pretixcontrol/items/index.html:118
#, fuzzy
#| msgid "Product settings"
msgid "Product assigned to seating plan"
msgstr "Productinstellingen"
msgstr "Product toegewezen tot een zittingsplan"
#: pretix/control/templates/pretixcontrol/items/index.html:126
msgid "Only available as an add-on product"
@@ -23786,10 +23772,8 @@ msgstr ""
"trackingaanbieders niet kennen."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
#, fuzzy
#| msgid "Availability"
msgid "Accessibility"
msgstr "Beschikbaarheid"
msgstr "Toegankelijkheid"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
msgid ""
@@ -23798,12 +23782,19 @@ msgid ""
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
"target=\"_blank\">our documentation</a>."
msgstr ""
"Sommige rechtsgebieden, waaronder de Europeese Unie, vereist jou om "
"informatie te publiceren over de toegankelijkheid van je ticket winkel. Je "
"kan een template vinden in <a href="
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">onze "
"documentatie</a>."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"In plaats van een URL, kan je ook een tekst instellen, dat wordt laten zien "
"binnen pretix. Dit wordt genegeerd als een URL is ingesteld."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
msgid "Barcode media"
@@ -29091,10 +29082,8 @@ msgid "Open BezahlCode in your banking app to start the payment process."
msgstr "Open BezahlCode in uw bank-app om het betalingsproces te starten."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:129
#, fuzzy
#| msgid "Scan the qr-code with your banking app"
msgid "Scan the QR code with your banking app"
msgstr "Scan de qr-code met uw bankapplicatie"
msgstr "Scan de QR-code met uw bankapplicatie"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:141
#, python-format
@@ -32272,17 +32261,12 @@ msgid "You need to fill out all fields."
msgstr "Vul alle velden in."
#: pretix/presale/forms/customer.py:69
#, fuzzy
#| msgid "Please enter a valid email address."
msgid "You need to enter an email address."
msgstr "Vul alstublieft een geldig e-mailadres in."
msgstr "U moet een e-mailadres invullen."
#: pretix/presale/forms/customer.py:70
#, fuzzy
#| msgctxt "subevent"
#| msgid "You need to select a date."
msgid "You need to enter a password."
msgstr "U moet een datum selecteren."
msgstr "U moet een wachtwoord invullen."
#: pretix/presale/forms/customer.py:72
msgid "We have not found an account with this email address and password."
@@ -32291,27 +32275,18 @@ msgstr ""
"wachtwoord vinden."
#: pretix/presale/forms/customer.py:74
#, fuzzy
#| msgid "Please enter the same email address twice."
msgid "Please verify that you entered the correct email address."
msgstr "Voer twee keer hetzelfde e-mailadres in."
msgstr "Alstublieft controleer of u het juiste emailadress heeft ingevuld."
#: pretix/presale/forms/customer.py:75
#, fuzzy
#| msgid "Please enter the correct result."
msgid "Please enter the correct password."
msgstr "Vul alstublieft het correcte resultaat in."
msgstr "Vul alstublieft het correcte wachtwoord in."
#: pretix/presale/forms/customer.py:76
msgid "This account is disabled."
msgstr "Dit account is uitgeschakeld."
#: pretix/presale/forms/customer.py:77
#, fuzzy
#| msgid ""
#| "You have not yet activated your account and set a password. Please click "
#| "the link in the email we sent you. Click \"Reset password\" to receive a "
#| "new email in case you cannot find it again."
msgid ""
"You have not yet activated your account and set a password. Please click the "
"link in the email we sent you. In case you cannot find it, click \"Forgot "
@@ -32323,10 +32298,8 @@ msgstr ""
"te klikken."
#: pretix/presale/forms/customer.py:90
#, fuzzy
#| msgid "Your password"
msgid "Forgot your password?"
msgstr "Uw wachtwoord"
msgstr "Wachtwoord vergeten?"
#: pretix/presale/forms/customer.py:146
msgid ""
@@ -32431,17 +32404,13 @@ msgid "Organizer: {organizer}"
msgstr "Organisator: {organizer}"
#: pretix/presale/templates/pretixpresale/base.html:47
#, fuzzy
#| msgid "Send links"
msgctxt "skip-to-main-nav"
msgid "Skip link"
msgstr "Verstuur links"
msgstr "Sla over link"
#: pretix/presale/templates/pretixpresale/base.html:48
#, fuzzy
#| msgid "Email content"
msgid "Skip to main content"
msgstr "E-mailinhoud"
msgstr "Overslaan naar de hoofd-inhoud"
#: pretix/presale/templates/pretixpresale/base.html:76
msgid "Footer Navigation"
@@ -33286,10 +33255,8 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation"
msgstr "Evenementomschrijving"
msgstr "Vernieuw reservering"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
msgid "Overview of your ordered products."
@@ -33643,8 +33610,6 @@ msgstr "Toon vorige maand, %(month)s"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:24
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:52
#, fuzzy
#| msgid "Select month to show"
msgid "Select a month to display"
msgstr "Kies maand om te tonen"
@@ -33656,11 +33621,8 @@ msgstr "Maand"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:39
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:67
#, fuzzy
#| msgctxt "reporting_timeframe"
#| msgid "by month"
msgid "Show month"
msgstr "per maand"
msgstr "Weergeven per maand"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:50
#, python-format
@@ -33675,10 +33637,8 @@ msgstr "Toon vorige week, %(week)s"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:24
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:52
#, fuzzy
#| msgid "Select week to show"
msgid "Select a week to display"
msgstr "Kies week om te tonen"
msgstr "Kies een week om te weer te geven"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:26
#: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:12
@@ -33692,11 +33652,8 @@ msgstr "Kies week om te tonen"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:43
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:71
#, fuzzy
#| msgctxt "reporting_timeframe"
#| msgid "by week"
msgid "Show week"
msgstr "per week"
msgstr "Weergeef per week"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:54
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:73
@@ -34622,8 +34579,6 @@ msgstr ""
"gaan."
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
#, fuzzy
#| msgid "Closed"
msgid "Close"
msgstr "Gesloten"
@@ -34668,8 +34623,6 @@ msgid "Save selection"
msgstr "Selectie opslaan"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
#, fuzzy
#| msgid "You did not select any products."
msgid "You didn't select any ticket."
msgstr "U heeft geen producten geselecteerd."
@@ -34678,6 +34631,8 @@ msgid ""
"Please tick a checkbox or enter a quantity for one of the ticket types to "
"add to the cart."
msgstr ""
"Alstublieft klik op een selectievak of voeg een quantiteit toe voor een van "
"de ticket types in de winkelwagen."
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:82
#, python-format
@@ -34729,10 +34684,9 @@ msgid "Event overview"
msgstr "Evenementenoverzicht"
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:21
#, fuzzy, python-format
#| msgid "Show next month, %(month)s"
#, python-format
msgid "Events in %(month)s"
msgstr "Toon volgende maand, %(month)s"
msgstr "Evenementen in %(month)s"
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:91
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:104
@@ -34742,28 +34696,22 @@ msgstr ""
"Merk op dat de evenementen in dit overzicht in verschillende tijdzones zijn."
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:21
#, fuzzy, python-format
#| msgid "Entry scan: %(date)s"
#, python-format
msgid "Events on %(day)s"
msgstr "Ingangsscan: %(date)s"
msgstr "Evenementen op %(day)s"
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:52
#, fuzzy
#| msgctxt "subevents"
#| msgid "Select date"
msgid "Select a date to display"
msgstr "Kies een datum"
msgstr "Kies een datum om weer te geven"
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:59
#, fuzzy
#| msgid "Show start date"
msgid "Show date"
msgstr "Toon startdatum"
msgstr "Weergeef startdatum"
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:21
#, python-format
msgid "Events in %(week)s (%(week_day_from)s %(week_day_to)s)"
msgstr ""
msgstr "Evenementen in %(week)s (%(week_day_from)s %(week_day_to)s)"
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:5
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:10
@@ -34997,10 +34945,8 @@ msgid "Your cart is now empty."
msgstr "Uw winkelwagen is nu leeg."
#: pretix/presale/views/cart.py:553
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Your cart timeout was extended."
msgstr "Uw winkelwagen is bijgewerkt."
msgstr "Uw winkelwagens tijdslimiet is verlengt."
#: pretix/presale/views/cart.py:568
msgid "The products have been successfully added to your cart."

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
"nl/>\n"
"Language: nl\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.1\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:62
@@ -415,6 +415,8 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
"ons op."
#: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message"
@@ -626,25 +628,26 @@ msgid "Unknown error."
msgstr "Onbekende fout."
#: 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."
msgstr "Uw kleur heeft een goed contrast, en is gemakkelijk te lezen!"
msgstr ""
"Uw kleur heeft een goed contrast, en zal zorgen voor een uitstekende "
"toegankelijkheid."
#: pretix/static/pretixcontrol/js/ui/main.js:296
#, fuzzy
#| msgid "Your color has decent contrast and is probably good-enough to read!"
msgid ""
"Your color has decent contrast and is sufficient for minimum accessibility "
"requirements."
msgstr ""
"Uw kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!"
"Uw kleur heeft een redelijk contrast, en is voldoende voor de minimale "
"toegankelijkheids eisen."
#: pretix/static/pretixcontrol/js/ui/main.js:300
msgid ""
"Your color has insufficient contrast to white. Accessibility of your site "
"will be impacted."
msgstr ""
"Uw kleur heeft een te weinig contrast met wit. De toegankelijkheid van jouw "
"site wordt beïnvloed."
#: pretix/static/pretixcontrol/js/ui/main.js:416
#: pretix/static/pretixcontrol/js/ui/main.js:436
@@ -720,7 +723,7 @@ msgstr "Winkelwagen is verlopen"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr ""
msgstr "Uw winkelwagen staat op het punt om te verlopen."
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -730,16 +733,10 @@ msgstr[1] ""
"De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "Winkelwagen is verlopen"
msgstr "Uw winkelwagen is verlopen."
#: pretix/static/pretixpresale/js/ui/cart.js:89
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
@@ -749,11 +746,11 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr ""
msgstr "Wilt u de reservererings periode vernieuwen?"
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr ""
msgstr "Vernieuw reservering"
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -796,12 +793,12 @@ msgstr "Verhoog aantal"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr ""
msgstr "Filter evenementen op"
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr ""
msgstr "Filter"
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1050,17 +1047,15 @@ msgid "Close"
msgstr "Sluiten"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "Doorgaan met afrekenen"
msgstr "Stoppen met afrekenen"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
"U kan niet deze actie annuleren. Alstublieft wacht tot het laden is voltooid."
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-04-28 01:00+0000\n"
"PO-Revision-Date: 2025-06-02 23:00+0000\n"
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
">\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.11\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -11070,7 +11070,7 @@ msgstr ""
#: pretix/base/settings.py:2434
#, python-brace-format
msgid "Your order is about to expire: {code}"
msgstr "Twoje zamówienie ma wygasa: {code}"
msgstr "Twoje zamówienie wkrótce wygaśnie: {code}"
#: pretix/base/settings.py:2438
#, python-brace-format
@@ -11090,7 +11090,7 @@ msgstr ""
"Witaj,\n"
"\n"
"Nie otrzymaliśmy jeszcze pełnej płatności za zamówienie na {event}.\n"
"Pamiętaj, że Twoje zamówienie będzi pewne tylko wtedy, jeżeli otrzymamy\n"
"Pamiętaj, że Twoje zamówienie będzie pewne tylko wtedy, jeżeli otrzymamy\n"
"Twoją płatność przed {expire_date}.\n"
"\n"
"Możesz wyświetlić informacje o płatności i status Twojego zamówienia pod "

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-02-03 16:07+0000\n"
"Last-Translator: Cornelius Kibelka <ckibelka-ctr@wikimedia.org>\n"
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
"pretix/pt/>\n"
"Language: pt\n"
@@ -17,59 +17,59 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 5.9.2\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/_base_settings.py:87
msgid "English"
msgstr ""
msgstr "Inglês"
#: pretix/_base_settings.py:88
msgid "German"
msgstr ""
msgstr "Alemão"
#: pretix/_base_settings.py:89
msgid "German (informal)"
msgstr ""
msgstr "Alemão (informal)"
#: pretix/_base_settings.py:90
msgid "Arabic"
msgstr ""
msgstr "Arabe"
#: pretix/_base_settings.py:91
msgid "Basque"
msgstr ""
msgstr "Basco"
#: pretix/_base_settings.py:92
msgid "Catalan"
msgstr ""
msgstr "Catalão"
#: pretix/_base_settings.py:93
msgid "Chinese (simplified)"
msgstr ""
msgstr "Chinês (simplificado)"
#: pretix/_base_settings.py:94
msgid "Chinese (traditional)"
msgstr ""
msgstr "chinês (tradicional)"
#: pretix/_base_settings.py:95
msgid "Czech"
msgstr ""
msgstr "Tcheco"
#: pretix/_base_settings.py:96
msgid "Croatian"
msgstr ""
msgstr "Croata"
#: pretix/_base_settings.py:97
msgid "Danish"
msgstr ""
msgstr "Dinamarquês"
#: pretix/_base_settings.py:98
msgid "Dutch"
msgstr "Alemão"
msgstr "Holandês"
#: pretix/_base_settings.py:99
msgid "Dutch (informal)"
msgstr "Alemão (informal)"
msgstr "Holandês (informal)"
#: pretix/_base_settings.py:100
msgid "French"
@@ -81,7 +81,7 @@ msgstr "Finlandês"
#: pretix/_base_settings.py:102
msgid "Galician"
msgstr ""
msgstr "Galego"
#: pretix/_base_settings.py:103
msgid "Greek"
@@ -89,11 +89,11 @@ msgstr "Grego"
#: pretix/_base_settings.py:104
msgid "Hebrew"
msgstr ""
msgstr "Hebraico"
#: pretix/_base_settings.py:105
msgid "Indonesian"
msgstr ""
msgstr "Indonésio"
#: pretix/_base_settings.py:106
msgid "Italian"
@@ -101,15 +101,15 @@ msgstr "Italiano"
#: pretix/_base_settings.py:107
msgid "Japanese"
msgstr ""
msgstr "Japonês"
#: pretix/_base_settings.py:108
msgid "Latvian"
msgstr ""
msgstr "Letão"
#: pretix/_base_settings.py:109
msgid "Norwegian Bokmål"
msgstr ""
msgstr "Bokmål norueguês"
#: pretix/_base_settings.py:110
msgid "Polish"
@@ -125,7 +125,7 @@ msgstr "Português (Brasil)"
#: pretix/_base_settings.py:113
msgid "Romanian"
msgstr ""
msgstr "Romano"
#: pretix/_base_settings.py:114
msgid "Russian"
@@ -133,11 +133,11 @@ msgstr "Russo"
#: pretix/_base_settings.py:115
msgid "Slovak"
msgstr ""
msgstr "Eslovaco"
#: pretix/_base_settings.py:116
msgid "Swedish"
msgstr ""
msgstr "Suéco"
#: pretix/_base_settings.py:117
msgid "Spanish"
@@ -149,7 +149,7 @@ msgstr "Turco"
#: pretix/_base_settings.py:119
msgid "Ukrainian"
msgstr ""
msgstr "Ucraniano"
#: pretix/api/auth/devicesecurity.py:58
msgid ""
@@ -184,10 +184,8 @@ msgid "Allowed URIs list, space separated"
msgstr "Lista de URIs permitidos, separados por espaço"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Lista de URIs permitidos, separados por espaço"
msgstr "Lista de URIs de saída de postagem permitidas, separadas por espaços"
#: pretix/api/models.py:51 pretix/base/models/customers.py:406
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:110
@@ -233,7 +231,7 @@ msgstr "Comentário"
#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1414
msgid "The product \"{}\" is not assigned to a quota."
msgstr ""
msgstr "O produto \"{}\" não está atribuído a uma cota."
#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1685
#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2184
@@ -251,6 +249,8 @@ msgid ""
"Events cannot be created as 'live'. Quotas and payment must be added to the "
"event before sales can go live."
msgstr ""
"Eventos não podem ser criados como \"ao vivo\". Cotas e pagamentos devem ser "
"adicionados ao evento antes que as vendas sejam publicadas."
#: pretix/api/serializers/event.py:246 pretix/api/serializers/event.py:555
#, python-brace-format
@@ -281,21 +281,23 @@ msgstr "A propriedade de metadados do item '{name}' não existe."
#: pretix/api/serializers/item.py:207 pretix/control/forms/item.py:1267
msgid "The bundled item must not be the same item as the bundling one."
msgstr ""
msgstr "O item agrupado não deve ser o mesmo item que o do pacote."
#: pretix/api/serializers/item.py:210 pretix/control/forms/item.py:1269
msgid "The bundled item must not have bundles on its own."
msgstr ""
msgstr "O item agrupado não deve ter pacotes próprios."
#: pretix/api/serializers/item.py:298
msgid ""
"Updating add-ons, bundles, or variations via PATCH/PUT is not supported. "
"Please use the dedicated nested endpoint."
msgstr ""
"Não há suporte para atualização de complementos, pacotes ou variações via "
"PATCH/PUT. Use o endpoint aninhado dedicado."
#: pretix/api/serializers/item.py:306
msgid "Only admission products can currently be personalized."
msgstr ""
msgstr "Atualmente, somente produtos de admissão podem ser personalizados."
#: pretix/api/serializers/item.py:317
msgid ""
@@ -317,6 +319,8 @@ msgid ""
"Updating options via PATCH/PUT is not supported. Please use the dedicated "
"nested endpoint."
msgstr ""
"A atualização de opções via PATCH/PUT não é suportada. Use o endpoint "
"aninhado dedicado."
#: pretix/api/serializers/item.py:533 pretix/control/forms/item.py:178
msgid "Question cannot depend on a question asked during check-in."
@@ -351,7 +355,7 @@ msgstr ""
#: pretix/api/serializers/order.py:79
#, python-brace-format
msgid "\"{input}\" is not a valid choice."
msgstr ""
msgstr "\"{input}\" não é uma escolha válida."
#: pretix/api/serializers/order.py:1375 pretix/api/views/cart.py:224
#: pretix/base/services/orders.py:1533
@@ -367,11 +371,12 @@ msgstr "O produto \"{}\" não está disponível nesta data."
msgid ""
"There is not enough quota available on quota \"{}\" to perform the operation."
msgstr ""
"Não há cota suficiente disponível na cota \"{}\" para executar a operação."
#: pretix/api/serializers/organizer.py:105
#: pretix/control/forms/organizer.py:892 pretix/presale/forms/customer.py:456
msgid "An account with this email address is already registered."
msgstr ""
msgstr "Uma conta com este endereço de e-mail já está registrada."
#: pretix/api/serializers/organizer.py:238
#: pretix/control/forms/organizer.py:741
@@ -400,11 +405,11 @@ msgstr "Este usuário já tem permissões para esta equipe."
#: pretix/api/views/cart.py:209
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr ""
msgstr "O voucher especificado já foi utilizado o número máximo de vezes."
#: pretix/api/views/checkin.py:611 pretix/api/views/checkin.py:618
msgid "Medium connected to other event"
msgstr ""
msgstr "Meio conectado a outro evento"
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:692
#, python-brace-format
@@ -462,9 +467,8 @@ msgid "Order expired"
msgstr "Pedido expirado"
#: pretix/api/webhooks.py:261
#, fuzzy
msgid "Order expiry date changed"
msgstr "Informações de pedido alteradas"
msgstr "Data de validade do pedido alterada"
#: pretix/api/webhooks.py:265 pretix/base/notifications.py:269
msgid "Order information changed"
@@ -480,9 +484,8 @@ msgid "Order changed"
msgstr "Pedido alterado"
#: pretix/api/webhooks.py:277
#, fuzzy
msgid "Refund of payment created"
msgstr "Reembolso externo de pagamento"
msgstr "Reembolso de pagamento criado"
#: pretix/api/webhooks.py:281 pretix/base/notifications.py:293
msgid "External refund of payment"
@@ -490,28 +493,23 @@ msgstr "Reembolso externo de pagamento"
#: pretix/api/webhooks.py:285
msgid "Refund of payment requested by customer"
msgstr ""
msgstr "Reembolso do pagamento solicitado pelo cliente"
#: pretix/api/webhooks.py:289
#, fuzzy
msgid "Refund of payment completed"
msgstr "Reembolso externo de pagamento"
msgstr "Reembolso de pagamento concluído"
#: pretix/api/webhooks.py:293
#, fuzzy
msgid "Refund of payment canceled"
msgstr "Reembolso externo de pagamento"
msgstr "Reembolso de pagamento cancelado"
#: pretix/api/webhooks.py:297
#, fuzzy
msgid "Refund of payment failed"
msgstr "Reembolso externo de pagamento"
msgstr "Falha no reembolso do pagamento"
#: pretix/api/webhooks.py:301
#, fuzzy
#| msgid "Payment provider"
msgid "Payment confirmed"
msgstr "Provedor de pagamento"
msgstr "Pagamento confirmado"
#: pretix/api/webhooks.py:305
msgid "Order approved"
@@ -522,18 +520,16 @@ msgid "Order denied"
msgstr "Pedido negado"
#: pretix/api/webhooks.py:313
#, fuzzy
#| msgid "Order denied"
msgid "Order deleted"
msgstr "Pedido negado"
msgstr "Pedido excluído"
#: pretix/api/webhooks.py:317
msgid "Ticket checked in"
msgstr "Ingresso registrado"
msgstr "Check-in do bilhete"
#: pretix/api/webhooks.py:321
msgid "Ticket check-in reverted"
msgstr "Ingresso revertido"
msgstr "O check-in do bilhete foi revertido"
#: pretix/api/webhooks.py:325
msgid "Event created"
@@ -544,14 +540,13 @@ msgid "Event details changed"
msgstr "Detalhes do evento alterados"
#: pretix/api/webhooks.py:333
#, fuzzy
msgid "Event deleted"
msgstr "Evento criado"
msgstr "Evento excluído"
#: pretix/api/webhooks.py:337
msgctxt "subevent"
msgid "Event series date added"
msgstr "Data da série de eventos adicionada"
msgstr "Data de adição da série de eventos"
#: pretix/api/webhooks.py:341
msgctxt "subevent"
@@ -561,64 +556,59 @@ msgstr "Data da série de eventos alterada"
#: pretix/api/webhooks.py:345
msgctxt "subevent"
msgid "Event series date deleted"
msgstr "Data da série de eventos apagada"
msgstr "Data da série de eventos excluída"
#: pretix/api/webhooks.py:349
msgid ""
"Product changed (including product added or deleted and including changes to "
"nested objects like variations or bundles)"
msgstr ""
"Produto alterado (incluindo produtos adicionados ou excluídos e incluindo "
"alterações em objetos aninhados, como variações ou pacotes)"
#: pretix/api/webhooks.py:354
msgid "Shop taken live"
msgstr ""
msgstr "Loja ao vivo"
#: pretix/api/webhooks.py:358
msgid "Shop taken offline"
msgstr ""
msgstr "Loja offline"
#: pretix/api/webhooks.py:362
#, fuzzy
msgid "Test-Mode of shop has been activated"
msgstr "A equipe selecionada não pode ser deletada."
msgstr "O modo de teste da loja foi ativado"
#: pretix/api/webhooks.py:366
#, fuzzy
msgid "Test-Mode of shop has been deactivated"
msgstr "A equipe selecionada não pode ser deletada."
msgstr "O modo de teste da loja foi desativado"
#: pretix/api/webhooks.py:370
msgid "Waiting list entry added"
msgstr ""
msgstr "Adicionado em aguardando na lista de espera"
#: pretix/api/webhooks.py:374
#, fuzzy
msgid "Waiting list entry changed"
msgstr "O valor foi creditado no seu cartão."
msgstr "Entrada na lista de espera alterada"
#: pretix/api/webhooks.py:378
#, fuzzy
msgid "Waiting list entry deleted"
msgstr "O valor foi creditado no seu cartão."
msgstr "Entrada na lista de espera excluída"
#: pretix/api/webhooks.py:382
msgid "Waiting list entry received voucher"
msgstr ""
msgstr "Inscrição na lista de espera recebeu voucher"
#: pretix/api/webhooks.py:386
#, fuzzy
msgid "Customer account created"
msgstr "País"
msgstr "Conta de cliente criada"
#: pretix/api/webhooks.py:390
#, fuzzy
msgid "Customer account changed"
msgstr "País"
msgstr "Conta do cliente alterada"
#: pretix/api/webhooks.py:394
#, fuzzy
msgid "Customer account anonymized"
msgstr "País"
msgstr "Conta de cliente anonimizada"
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1004
@@ -631,15 +621,15 @@ msgstr "País"
#: pretix/plugins/banktransfer/payment.py:679
#: pretix/presale/forms/customer.py:151
msgid "This field is required."
msgstr ""
msgstr "Este campo é obrigatório."
#: pretix/base/addressvalidation.py:213
msgid "Enter a postal code in the format XXX."
msgstr ""
msgstr "Digite um código postal no formato XXX."
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
msgid "Enter a postal code in the format XXXX."
msgstr ""
msgstr "Digite um código postal no formato XXXX."
#: pretix/base/auth.py:146
#, python-brace-format
@@ -680,7 +670,7 @@ msgstr "Senha"
#: pretix/base/auth.py:176 pretix/base/auth.py:183
msgid "Your password must contain both numeric and alphabetic characters."
msgstr ""
msgstr "Sua senha deve conter caracteres numéricos e alfabéticos."
#: pretix/base/auth.py:202 pretix/base/auth.py:212
#, python-format
@@ -688,8 +678,10 @@ msgid "Your password may not be the same as your previous password."
msgid_plural ""
"Your password may not be the same as one of your %(history_length)s previous "
"passwords."
msgstr[0] ""
msgstr[0] "Sua senha pode não ser a mesma que sua senha anterior."
msgstr[1] ""
"Sua senha pode não ser a mesma que uma das suas senhas anteriores de "
"%(history_length)s."
#: pretix/base/channels.py:168
msgid "Online shop"
@@ -697,13 +689,15 @@ msgstr "Loja online"
#: pretix/base/channels.py:174
msgid "API"
msgstr ""
msgstr "API"
#: pretix/base/channels.py:175
msgid ""
"API sales channels come with no built-in functionality, but may be used for "
"custom integrations."
msgstr ""
"API de canais de vendas de não vêm com nenhuma funcionalidade integrada, "
"mas podem ser usados para integrações personalizadas."
#: pretix/base/context.py:38
#, fuzzy, python-brace-format
@@ -729,25 +723,27 @@ msgstr "código-fonte"
#: pretix/base/customersso/oidc.py:61
#, python-brace-format
msgid "Configuration option \"{name}\" is missing."
msgstr ""
msgstr "A opção de configuração \"{name}\" está ausente."
#: pretix/base/customersso/oidc.py:69 pretix/base/customersso/oidc.py:74
#, python-brace-format
msgid ""
"Unable to retrieve configuration from \"{url}\". Error message: \"{error}\"."
msgstr ""
"Não foi possível recuperar a configuração de \"{url}\". Mensagem de erro: "
"\"{error}\"."
#: pretix/base/customersso/oidc.py:80 pretix/base/customersso/oidc.py:85
#: pretix/base/customersso/oidc.py:90 pretix/base/customersso/oidc.py:95
#: pretix/base/customersso/oidc.py:100 pretix/base/customersso/oidc.py:105
#, python-brace-format
msgid "Incompatible SSO provider: \"{error}\"."
msgstr ""
msgstr "Provedor SSO incompatível: \"{error}\"."
#: pretix/base/customersso/oidc.py:111
#, python-brace-format
msgid "You are not requesting \"{scope}\"."
msgstr ""
msgstr "Você não está solicitando \"{scope}\"."
#: pretix/base/customersso/oidc.py:117
#, python-brace-format
@@ -755,6 +751,8 @@ msgid ""
"You are requesting scope \"{scope}\" but provider only supports these: "
"{scopes}."
msgstr ""
"Você está solicitando o escopo \"{scope}\", mas o provedor só oferece "
"suporte a estes: {scopes}."
#: pretix/base/customersso/oidc.py:127
#, python-brace-format
@@ -762,6 +760,8 @@ msgid ""
"You are requesting field \"{field}\" but provider only supports these: "
"{fields}."
msgstr ""
"Você está solicitando o campo \"{field}\", mas o provedor suporta somente "
"estes: {fields}."
#: pretix/base/customersso/oidc.py:219 pretix/base/customersso/oidc.py:226
#: pretix/base/customersso/oidc.py:245 pretix/base/customersso/oidc.py:262
@@ -770,13 +770,15 @@ msgstr ""
#: pretix/presale/views/customer.py:866
#, python-brace-format
msgid "Login was not successful. Error message: \"{error}\"."
msgstr ""
msgstr "O login não foi bem-sucedido. Mensagem de erro: \"{error}\"."
#: pretix/base/customersso/oidc.py:252
msgid ""
"The email address on this account is not yet verified. Please first confirm "
"the email address in your customer account."
msgstr ""
"O endereço de e-mail desta conta ainda não foi verificado. Primeiro, "
"confirme o endereço de e-mail na sua conta de cliente."
#: pretix/base/email.py:203 pretix/base/exporters/items.py:157
#: pretix/base/exporters/items.py:205 pretix/control/views/main.py:322
@@ -830,17 +832,17 @@ msgstr "Respostas para perguntas sobre o upload de arquivos"
#: pretix/base/exporters/orderlist.py:1241
#: pretix/plugins/reports/exporters.py:478
#: pretix/plugins/reports/exporters.py:651
#, fuzzy
#| msgid "Order data"
msgctxt "export_category"
msgid "Order data"
msgstr "Dia do pedido"
msgstr "Data do pedido"
#: pretix/base/exporters/answers.py:56
msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"Baixe um arquivo ZIP incluindo todos os arquivos que foram enviados pelos "
"seus clientes ao criar um pedido."
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1767
#: pretix/control/navigation.py:172
@@ -881,7 +883,7 @@ msgstr "Perguntas"
#: pretix/presale/templates/pretixpresale/event/fragment_change_form.html:20
msgctxt "subevent"
msgid "Date"
msgstr ""
msgstr "Data"
#: pretix/base/exporters/answers.py:79 pretix/base/exporters/answers.py:88
#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1611
@@ -899,22 +901,22 @@ msgstr ""
#: pretix/plugins/sendmail/forms.py:351
msgctxt "subevent"
msgid "All dates"
msgstr ""
msgstr "Todas as datas"
#: pretix/base/exporters/customers.py:49 pretix/control/navigation.py:606
#: pretix/control/templates/pretixcontrol/organizers/edit.html:132
msgid "Customer accounts"
msgstr ""
msgstr "Contas de clientes"
#: pretix/base/exporters/customers.py:51
#, fuzzy
msgctxt "export_category"
msgid "Customer accounts"
msgstr "País"
msgstr "Contas de clientes"
#: pretix/base/exporters/customers.py:52
msgid "Download a spreadsheet of all currently registered customer accounts."
msgstr ""
"Baixe uma planilha de todas as contas de clientes registradas atualmente."
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82
#: pretix/control/templates/pretixcontrol/organizers/customer.html:29
@@ -922,20 +924,19 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_customer.html:36
#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:37
msgid "Customer ID"
msgstr ""
msgstr "ID do cliente"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:32
#, fuzzy
msgid "SSO provider"
msgstr "Provedor de pagamento"
msgstr "Provedor de SSO"
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108
#: pretix/control/templates/pretixcontrol/organizers/customer.html:36
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
#: pretix/control/templates/pretixcontrol/users/form.html:49
msgid "External identifier"
msgstr ""
msgstr "Identificador externo"
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:262
#: pretix/base/exporters/orderlist.py:445
@@ -960,7 +961,7 @@ msgstr "Número de telefone"
#: pretix/base/settings.py:3640 pretix/base/settings.py:3652
#: pretix/control/templates/pretixcontrol/users/index.html:47
msgid "Full name"
msgstr ""
msgstr "Nome Completo"
#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:206
#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:332
@@ -1008,21 +1009,21 @@ msgstr "Nome"
#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99
msgid "Account active"
msgstr ""
msgstr "Conta ativa"
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
msgid "Verified email address"
msgstr ""
msgstr "Endereço de e-mail verificado"
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
#: pretix/control/templates/pretixcontrol/organizers/customer.html:68
msgid "Last login"
msgstr ""
msgstr "Último login"
#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102
#: pretix/control/templates/pretixcontrol/organizers/customer.html:66
msgid "Registration date"
msgstr ""
msgstr "Data de inscrição"
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
#: pretix/base/exporters/waitinglist.py:120 pretix/base/models/auth.py:258
@@ -1038,7 +1039,7 @@ msgstr "Idioma"
#: pretix/control/templates/pretixcontrol/organizers/customer.html:72
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
msgid "Notes"
msgstr ""
msgstr "Notas"
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -1115,6 +1116,8 @@ msgid ""
"Download invoices in a format that can be used by the dekodi NREI conversion "
"software."
msgstr ""
"Baixe faturas em um formato que possa ser usado pelo software de conversão "
"de NREI dekodi."
#: pretix/base/exporters/dekodi.py:105
#, python-brace-format
@@ -1132,7 +1135,7 @@ msgstr "Ingresso do evento {event}-{code}"
#: pretix/plugins/reports/exporters.py:698
#: pretix/plugins/ticketoutputpdf/exporters.py:85
msgid "Date range"
msgstr ""
msgstr "Intervalo de datas"
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
#, fuzzy
@@ -1147,21 +1150,21 @@ msgstr ""
"fatura nem sempre corresponde à data do pedido ou do pagamento."
#: pretix/base/exporters/events.py:47
#, fuzzy
msgid "Event data"
msgstr "Data final do evento"
msgstr "Dados do evento"
#: pretix/base/exporters/events.py:48
#, fuzzy
msgctxt "export_category"
msgid "Event data"
msgstr "Data final do evento"
msgstr "Dados do evento"
#: pretix/base/exporters/events.py:49
msgid ""
"Download a spreadsheet with information on all events in this organizer "
"account."
msgstr ""
"Baixe uma planilha com informações sobre todos os eventos nesta conta do "
"organizador."
#: pretix/base/exporters/events.py:57 pretix/base/exporters/orderlist.py:261
#: pretix/base/exporters/orderlist.py:441
@@ -1173,17 +1176,17 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/events/index.html:68
#: pretix/control/templates/pretixcontrol/organizers/detail.html:64
msgid "Event name"
msgstr ""
msgstr "Nome do evento"
#: pretix/base/exporters/events.py:58 pretix/base/models/event.py:588
#: pretix/base/models/organizer.py:91
#: pretix/control/templates/pretixcontrol/organizers/index.html:47
msgid "Short form"
msgstr ""
msgstr "Forma abreviada"
#: pretix/base/exporters/events.py:59 pretix/base/models/event.py:590
msgid "Shop is live"
msgstr ""
msgstr "A loja está no ar"
#: pretix/base/exporters/events.py:60 pretix/base/models/event.py:592
msgid "Event currency"
@@ -1192,59 +1195,59 @@ msgstr "Moeda do evento"
#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:261
#: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93
msgid "Timezone"
msgstr ""
msgstr "Fuso horário"
#: pretix/base/exporters/events.py:62 pretix/base/models/event.py:595
#: pretix/base/models/event.py:1489 pretix/base/settings.py:3263
#: pretix/base/settings.py:3273 pretix/control/forms/subevents.py:480
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:268
msgid "Event start time"
msgstr ""
msgstr "Hora de início do evento"
#: pretix/base/exporters/events.py:63 pretix/base/models/event.py:597
#: pretix/base/models/event.py:1491 pretix/base/pdf.py:286
#: pretix/control/forms/subevents.py:485
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:270
msgid "Event end time"
msgstr ""
msgstr "Horário de término do evento"
#: pretix/base/exporters/events.py:64 pretix/base/models/event.py:599
#: pretix/base/models/event.py:1493 pretix/control/forms/subevents.py:490
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:274
msgid "Admission time"
msgstr ""
msgstr "Horário de entrada"
#: pretix/base/exporters/events.py:65 pretix/base/models/event.py:611
#: pretix/base/models/event.py:1502 pretix/control/forms/subevents.py:93
msgid "Start of presale"
msgstr ""
msgstr "Início da pré-venda"
#: pretix/base/exporters/events.py:66 pretix/base/models/event.py:605
#: pretix/base/models/event.py:1496 pretix/control/forms/subevents.py:99
msgid "End of presale"
msgstr ""
msgstr "Fim da pré-venda"
#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:351
#: pretix/base/models/event.py:617 pretix/base/models/event.py:1508
msgid "Location"
msgstr ""
msgstr "Localização"
#: pretix/base/exporters/events.py:68 pretix/base/models/event.py:625
#: pretix/base/models/event.py:1511
msgid "Latitude"
msgstr ""
msgstr "Latitude"
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:633
#: pretix/base/models/event.py:1519
msgid "Longitude"
msgstr ""
msgstr "Longitude"
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:645
#: pretix/base/models/event.py:1534
#: pretix/control/templates/pretixcontrol/event/index.html:128
#: pretix/control/templates/pretixcontrol/order/index.html:991
msgid "Internal comment"
msgstr ""
msgstr "Comentário interno"
#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753
#: pretix/base/models/orders.py:2162 pretix/control/forms/filter.py:204
@@ -1284,7 +1287,7 @@ msgstr "Todas faturas"
#: pretix/base/exporters/invoices.py:127
msgid "Download all invoices created by the system as a ZIP file of PDF files."
msgstr ""
msgstr "Baixe todas as faturas criadas pelo sistema como um arquivo ZIP ou PDF."
#: pretix/base/exporters/invoices.py:178
msgid "Invoice data"
@@ -1296,6 +1299,9 @@ msgid ""
"The spreadsheet includes two sheets, one with a line for every invoice, and "
"one with a line for every position of every invoice."
msgstr ""
"Baixe uma planilha com os dados de todas as faturas criadas pelo sistema. A "
"planilha inclui duas folhas, uma com uma linha para cada fatura e outra com "
"uma linha para cada posição de cada fatura."
#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:576
#: pretix/control/templates/pretixcontrol/order/index.html:268
@@ -1355,7 +1361,7 @@ msgstr "Data"
#: pretix/plugins/reports/exporters.py:884
#: pretix/plugins/ticketoutputpdf/exporters.py:96
msgid "Order code"
msgstr "Código de pedido"
msgstr "Código do pedido"
#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329
#: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59
@@ -26318,7 +26324,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
msgid "Comment:"
msgstr ""
msgstr "Comentário:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
msgid "No order code detected"
@@ -26591,7 +26597,7 @@ msgstr ""
#: pretix/plugins/paypal2/payment.py:1096
#: pretix/plugins/paypal2/payment.py:1097 pretix/plugins/stripe/payment.py:1816
msgid "PayPal"
msgstr ""
msgstr "PayPal"
#: pretix/plugins/paypal/apps.py:53
msgid ""
@@ -28075,7 +28081,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
msgid "iDEAL"
msgstr ""
msgstr "iDEAL"
#: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352
#: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395
@@ -28095,11 +28101,11 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564
msgid "Bancontact"
msgstr ""
msgstr "Contato bancário"
#: pretix/plugins/stripe/payment.py:366
msgid "SEPA Direct Debit"
msgstr ""
msgstr "Débito Direto SEPA"
#: pretix/plugins/stripe/payment.py:369
msgid ""
@@ -28135,7 +28141,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730
msgid "Przelewy24"
msgstr ""
msgstr "Przelewy24"
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769
msgid "WeChat Pay"
@@ -28284,7 +28290,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:1480
msgid "giropay"
msgstr ""
msgstr "giropay"
#: pretix/plugins/stripe/payment.py:1483
msgid ""
@@ -31717,14 +31723,17 @@ msgid ""
"while we are processing your current payment. Please check back after your "
"current payment has been accepted."
msgstr ""
"Você não pode alterar seu pedido de forma que exija pagamento adicional "
"enquanto estivermos processando seu pagamento atual. Verifique novamente "
"após a aceitação do seu pagamento atual."
#: pretix/presale/views/order.py:1662 pretix/presale/views/order.py:1693
msgid "You cannot change this order."
msgstr ""
msgstr "Você não pode alterar este pedido."
#: pretix/presale/views/user.py:61
msgid "We had difficulties processing your input."
msgstr ""
msgstr "Tivemos dificuldades em processar sua entrada."
#: pretix/presale/views/user.py:70
#, python-brace-format
@@ -31734,32 +31743,43 @@ msgid ""
"{number} hours. If the email did not arrive, please check your spam folder "
"and also double check that you used the correct email address."
msgstr ""
"Se o endereço de e-mail informado for válido e estiver associado a um "
"ingresso, já enviamos um e-mail com um link para o seu ingresso nas últimas "
"{number} horas. Se o e-mail não chegou, verifique sua caixa de spam e "
"verifique se você usou o endereço de e-mail correto."
#: pretix/presale/views/user.py:91
msgid "We have trouble sending emails right now, please check back later."
msgstr ""
"Estamos com problemas para enviar e-mails neste momento. Volte mais tarde."
#: pretix/presale/views/user.py:94
msgid ""
"If there were any orders by this user, they will receive an email with their "
"order codes."
msgstr ""
"Se houver algum pedido deste usuário, ele receberá um e-mail com seus "
"códigos de pedido."
#: pretix/presale/views/waiting.py:127
msgid ""
"No ticket types are available for the waiting list, have a look at the "
"ticket shop instead."
msgstr ""
"Não há tipos de ingressos disponíveis para a lista de espera; em vez disso, "
"dê uma olhada na loja de ingressos."
#: pretix/presale/views/waiting.py:137 pretix/presale/views/waiting.py:161
msgid "Waiting lists are disabled for this event."
msgstr ""
msgstr "As listas de espera estão desativadas para este evento."
#: pretix/presale/views/waiting.py:173
msgid ""
"You cannot add yourself to the waiting list as this product is currently "
"available."
msgstr ""
"Você não pode se adicionar à lista de espera, pois este produto ainda não "
"está disponível."
#: pretix/presale/views/waiting.py:180
#, python-brace-format
@@ -31767,35 +31787,40 @@ msgid ""
"We've added you to the waiting list. We will send an email to {email} as "
"soon as this product gets available again."
msgstr ""
"Adicionamos você à lista de espera. Enviaremos um e-mail para {email} assim "
"que este produto estiver disponível novamente."
#: pretix/presale/views/waiting.py:208
msgid "We could not find you on our waiting list."
msgstr ""
msgstr "Não conseguimos encontrá-lo em nossa lista de espera."
#: pretix/presale/views/waiting.py:212
msgid ""
"Your waiting list spot is no longer valid or already used. There's nothing "
"more to do here."
msgstr ""
"Sua vaga na lista de espera não é mais válida ou já foi usada. Não há mais "
"nada a fazer aqui."
#: pretix/presale/views/waiting.py:222
msgid ""
"Thank you very much! We will assign your spot on the waiting list to someone "
"else."
msgstr ""
"Muito obrigado! Vamos atribuir a sua vaga na lista de espera a outra pessoa."
#: pretix/presale/views/widget.py:397
msgid "This ticket shop is currently disabled."
msgstr ""
msgstr "Esta bilheteria está desativada no momento."
#: pretix/presale/views/widget.py:411
msgid "The selected date does not exist in this event series."
msgstr ""
msgstr "A data selecionada não existe nesta série de eventos."
#: pretix/presale/views/widget.py:474
#, python-format
msgid "from %(start_date)s"
msgstr ""
msgstr "a partir de %(start_date)s"
#: pretix/settings.py:789
msgid "User profile only"
@@ -31803,15 +31828,15 @@ msgstr "Somente perfil de usuário"
#: pretix/settings.py:790
msgid "Read access"
msgstr ""
msgstr "Acesso de leitura"
#: pretix/settings.py:791
msgid "Write access"
msgstr ""
msgstr "Acesso de escrita"
#: pretix/settings.py:802
msgid "Kosovo"
msgstr ""
msgstr "Kosovo"
#, fuzzy
#~| msgid "Email"

View File

@@ -3,79 +3,80 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\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:62
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
msgid "Marked as paid"
msgstr ""
msgstr "Marcado como pago"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
msgid "Comment:"
msgstr ""
msgstr "Comentário:"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
msgid "PayPal"
msgstr ""
msgstr "PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
msgstr ""
msgstr "Venmo"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
#: pretix/static/pretixpresale/js/walletdetection.js:38
msgid "Apple Pay"
msgstr ""
msgstr "Apple Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
msgid "Itaú"
msgstr ""
msgstr "Itaú"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
msgid "PayPal Credit"
msgstr ""
msgstr "Crédito PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:39
msgid "Credit Card"
msgstr ""
msgstr "Cartão de crédito"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
msgid "PayPal Pay Later"
msgstr ""
msgstr "PayPal Pagar Depois"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
msgid "iDEAL"
msgstr ""
msgstr "iDEAL"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
msgid "SEPA Direct Debit"
msgstr ""
msgstr "Débito Direto SEPA"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
msgid "Bancontact"
msgstr ""
msgstr "Contato bancário"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
msgid "giropay"
msgstr ""
msgstr "giropay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
msgid "SOFORT"
msgstr ""
msgstr "SOFORT"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
msgid "eps"
@@ -83,15 +84,15 @@ msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
msgid "MyBank"
msgstr ""
msgstr "MyBank"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
msgid "Przelewy24"
msgstr ""
msgstr "Przelewy24"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
msgid "Verkkopankki"
msgstr ""
msgstr "Verkkopankki"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
msgid "PayU"
@@ -127,7 +128,7 @@ msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
msgid "Mercado Pago"
msgstr ""
msgstr "Mercado Pago"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n"
@@ -10604,10 +10604,8 @@ msgstr ""
"você usa os dados coletados em sua loja de ingressos."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "Informações da conta"
msgstr "URL de informação de acessibilidade"
#: pretix/base/settings.py:2072
#, fuzzy

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"Last-Translator: Luan Thien <vanthienluan@gmail.com>\n"
"PO-Revision-Date: 2025-06-06 06:09+0000\n"
"Last-Translator: Michael Dao <garudong89@gmail.com>\n"
"Language-Team: Vietnamese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/vi/>\n"
"Language: vi\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.5.5\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:62
@@ -35,16 +35,16 @@ msgstr "PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
msgstr "Venmo"
msgstr "Nền tảng Venmo"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
#: pretix/static/pretixpresale/js/walletdetection.js:38
msgid "Apple Pay"
msgstr "Apple Pay"
msgstr "Nền tảng Apple Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
msgid "Itaú"
msgstr "Itaú"
msgstr "Nền tảng Itaú"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
msgid "PayPal Credit"
@@ -56,11 +56,11 @@ msgstr "Thẻ tín dụng"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
msgid "PayPal Pay Later"
msgstr "PayPal Pay Later"
msgstr "Nền tảng PayPal Pay Later"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
msgid "iDEAL"
msgstr "iDEAL"
msgstr "Nền tảng iDEAL"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
msgid "SEPA Direct Debit"
@@ -68,11 +68,11 @@ msgstr "Ghi nợ trực tiếp SEPA"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
msgid "Bancontact"
msgstr "Bancontact"
msgstr "Nền tảng Bancontact"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
msgid "giropay"
msgstr "giropay"
msgstr "Nền tảng giropay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
msgid "SOFORT"
@@ -80,55 +80,55 @@ msgstr "SOFORT"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
msgid "eps"
msgstr "eps"
msgstr "Nền tảng eps"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
msgid "MyBank"
msgstr ""
msgstr "Nền tảng MyBank"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
msgid "Przelewy24"
msgstr ""
msgstr "Nền tảng Przelewy24"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
msgid "Verkkopankki"
msgstr ""
msgstr "Nền tảng Verkkopankki"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
msgid "PayU"
msgstr ""
msgstr "Nền tảng PayU"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:51
msgid "BLIK"
msgstr ""
msgstr "Nền tảng BLIK"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:52
msgid "Trustly"
msgstr ""
msgstr "Nền tảng Trustly"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:53
msgid "Zimpler"
msgstr ""
msgstr "Nền tảng Zimpler"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:54
msgid "Maxima"
msgstr ""
msgstr "Nền tảng Maxima"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:55
msgid "OXXO"
msgstr ""
msgstr "?? OXXO"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:56
msgid "Boleto"
msgstr ""
msgstr "Nền tảng Boleto"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:57
msgid "WeChat Pay"
msgstr ""
msgstr "Nền tảng WeChat Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
msgid "Mercado Pago"
msgstr ""
msgstr "Nền tảng Mercado Pago"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
@@ -238,11 +238,11 @@ msgstr "Đã huỷ"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Confirmed"
msgstr ""
msgstr "Đã Xác Nhận"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Approval pending"
msgstr ""
msgstr "Đang chờ phê duyệt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
msgid "Redeemed"
@@ -307,7 +307,7 @@ msgstr "Vé không hợp lệ tại thời điểm này"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order canceled"
msgstr "Đã huỷ đơn hàng"
msgstr "Đơn hàng đã bị hủy"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Ticket code is ambiguous on list"
@@ -348,7 +348,7 @@ msgstr "đóng"
#: pretix/static/pretixbase/js/addressform.js:59
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "required"
msgstr ""
msgstr "bắt buộc"
#: pretix/static/pretixbase/js/asynctask.js:12
msgid ""
@@ -411,6 +411,8 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
"Yêu cầu của bạn hiện đang được xử lý. Tùy theo quy mô sự kiện, quá trình này "
"có thể mất đến vài phút."
#: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message"
@@ -480,27 +482,27 @@ msgstr "Số mục trước từ khi"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
msgid "Number of previous entries before"
msgstr "Số mục trước trước lúc"
msgstr "Số lượt nhập trước đó"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
msgid "Number of days with a previous entry"
msgstr ""
msgstr "Số ngày có lượt nhập trước đó"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:143
msgid "Number of days with a previous entry since"
msgstr ""
msgstr "Số ngày có lượt nhập trước đó kể từ khi"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:147
msgid "Number of days with a previous entry before"
msgstr ""
msgstr "Số ngày có lượt nhập trước đó trước"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:151
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
msgstr "Số phút kể từ lượt nhập cuối cùng (-1 đối với lượt nhập đầu tiên)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:155
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
msgstr "Số phút kể từ lượt nhập đầu tiên (-1 đối với lượt nhập đầu tiên)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182
msgid "All of the conditions below (AND)"
@@ -569,16 +571,12 @@ msgid "Group of objects"
msgstr "Nhóm các đối tượng"
#: pretix/static/pretixcontrol/js/ui/editor.js:908
#, fuzzy
#| msgid "Text object"
msgid "Text object (deprecated)"
msgstr "Văn bản"
msgstr "Đối tượng văn bản (đã lỗi thời)"
#: pretix/static/pretixcontrol/js/ui/editor.js:910
#, fuzzy
#| msgid "Text object"
msgid "Text box"
msgstr "Văn bản"
msgstr "Văn bản chữ"
#: pretix/static/pretixcontrol/js/ui/editor.js:912
msgid "Barcode area"
@@ -626,24 +624,26 @@ msgid "Unknown error."
msgstr "Lỗi không xác định."
#: 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."
msgstr "Bạn đã chọn màu có độ tương phản tốt và dễ đọc!"
msgstr ""
"Màu sắc của bạn có độ tương phản cao và sẽ mang lại khả năng tiếp cận tuyệt "
"vời."
#: pretix/static/pretixcontrol/js/ui/main.js:296
#, fuzzy
#| msgid "Your color has decent contrast and is probably good-enough to read!"
msgid ""
"Your color has decent contrast and is sufficient for minimum accessibility "
"requirements."
msgstr "Bạn đã giảm độ tương phản và có lẽ khá tốt để đọc!"
msgstr ""
"Màu sắc của bạn có độ tương phản khá và đủ đáp ứng yêu cầu tối thiểu về khả "
"năng tiếp cận."
#: pretix/static/pretixcontrol/js/ui/main.js:300
msgid ""
"Your color has insufficient contrast to white. Accessibility of your site "
"will be impacted."
msgstr ""
"Màu sắc của bạn có độ tương phản không đủ so với màu trắng. Khả năng tiếp "
"cận của trang web bạn sẽ bị ảnh hưởng."
#: pretix/static/pretixcontrol/js/ui/main.js:416
#: pretix/static/pretixcontrol/js/ui/main.js:436
@@ -672,246 +672,246 @@ msgstr "Số trang không hợp lệ."
#: pretix/static/pretixcontrol/js/ui/main.js:943
msgid "Use a different name internally"
msgstr ""
msgstr "Sử dụng tên khác ở bên trong"
#: pretix/static/pretixcontrol/js/ui/main.js:983
msgid "Click to close"
msgstr ""
msgstr "Nhấn để đóng"
#: pretix/static/pretixcontrol/js/ui/main.js:1064
msgid "You have unsaved changes!"
msgstr ""
msgstr "Bạn có những thay đổi chưa được lưu!"
#: pretix/static/pretixcontrol/js/ui/orderchange.js:25
msgid "Calculating default price…"
msgstr ""
msgstr "Đang tính giá mặc định…"
#: pretix/static/pretixcontrol/js/ui/plugins.js:69
#, fuzzy
#| msgid "Search results"
msgid "No results"
msgstr "Kết quả tìm kiếm"
msgstr "Không có kết quả"
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
msgstr ""
msgstr "Khác"
#: pretix/static/pretixcontrol/js/ui/question.js:82
msgid "Count"
msgstr ""
msgstr "Số lượng"
#: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)"
msgid_plural "({num} more dates)"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "{num} ngày còn lại"
#: pretix/static/pretixpresale/js/ui/cart.js:48
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
"hoàn tất đơn hàng miễn là chúng còn hàng."
#: pretix/static/pretixpresale/js/ui/cart.js:50
msgid "Cart expired"
msgstr ""
msgstr "Giỏ hàng đã hết hạn"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr ""
msgstr "Giỏ hàng của bạn sắp hết hạn."
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Các mặt hàng trong giỏ của bạn được giữ trong vòng {num} phút."
#: pretix/static/pretixpresale/js/ui/cart.js:86
msgid "Your cart has expired."
msgstr ""
msgstr "Giỏ hàng của bạn đã hết hạn."
#: pretix/static/pretixpresale/js/ui/cart.js:89
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
msgstr ""
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
"hoàn tất đơn hàng miễn là chúng còn hàng."
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr ""
msgstr "Bạn có muốn gia hạn thời gian giữ chỗ không?"
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr ""
msgstr "Gia hạn giữ chỗ"
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
msgstr ""
msgstr "Người tổ chức giữ lại %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "You get %(currency)s %(amount)s back"
msgstr ""
msgstr "Bạn nhận lại %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:218
msgid "Please enter the amount the organizer can keep."
msgstr ""
msgstr "Vui lòng nhập số tiền người tổ chức được giữ lại."
#: pretix/static/pretixpresale/js/ui/main.js:558
msgid "Your local time:"
msgstr ""
msgstr "Thời gian địa phương của bạn:"
#: pretix/static/pretixpresale/js/walletdetection.js:39
msgid "Google Pay"
msgstr ""
msgstr "Nền tảng Google Pay"
#: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/js/widget/widget.v1.js:16
msgctxt "widget"
msgid "Quantity"
msgstr ""
msgstr "Số lượng"
#: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/js/widget/widget.v1.js:17
msgctxt "widget"
msgid "Decrease quantity"
msgstr ""
msgstr "Giảm số lượng"
#: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/js/widget/widget.v1.js:18
msgctxt "widget"
msgid "Increase quantity"
msgstr ""
msgstr "Tăng số lượng"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr ""
msgstr "Lọc sự kiện bởi"
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr ""
msgstr "Lọc"
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
msgctxt "widget"
msgid "Price"
msgstr ""
msgstr "Giá"
#: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/js/widget/widget.v1.js:20
#, javascript-format
msgctxt "widget"
msgid "Original price: %s"
msgstr ""
msgstr "Giá gốc: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/js/widget/widget.v1.js:21
#, javascript-format
msgctxt "widget"
msgid "New price: %s"
msgstr ""
msgstr "Giá mới: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/js/widget/widget.v1.js:22
msgctxt "widget"
msgid "Select"
msgstr ""
msgstr "Chọn"
#: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/js/widget/widget.v1.js:23
#, javascript-format
msgctxt "widget"
msgid "Select %s"
msgstr ""
msgstr "Chọn %s"
#: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/js/widget/widget.v1.js:24
#, javascript-format
msgctxt "widget"
msgid "Select variant %s"
msgstr ""
msgstr "Chọn biến thể %s"
#: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/js/widget/widget.v1.js:25
msgctxt "widget"
msgid "Sold out"
msgstr ""
msgstr "Bán hết"
#: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/js/widget/widget.v1.js:26
msgctxt "widget"
msgid "Buy"
msgstr ""
msgstr "Mua"
#: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/js/widget/widget.v1.js:27
msgctxt "widget"
msgid "Register"
msgstr ""
msgstr "Đăng ký"
#: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/js/widget/widget.v1.js:28
msgctxt "widget"
msgid "Reserved"
msgstr ""
msgstr "Đã đặt"
#: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/js/widget/widget.v1.js:29
msgctxt "widget"
msgid "FREE"
msgstr ""
msgstr "MIỄN PHÍ"
#: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/js/widget/widget.v1.js:30
msgctxt "widget"
msgid "from %(currency)s %(price)s"
msgstr ""
msgstr "từ %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/js/widget/widget.v1.js:31
#, javascript-format
msgctxt "widget"
msgid "Image of %s"
msgstr ""
msgstr "Hình của %s"
#: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/js/widget/widget.v1.js:32
msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s"
msgstr ""
msgstr "đã bao gồm %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/js/widget/widget.v1.js:33
msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s"
msgstr ""
msgstr "cộng thêm %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/js/widget/widget.v1.js:34
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "đã bao gồm thuế"
#: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/js/widget/widget.v1.js:35
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr "cộng thêm thuế"
#: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/js/widget/widget.v1.js:36
#, javascript-format
msgctxt "widget"
msgid "currently available: %s"
msgstr ""
msgstr "hiện có sẵn: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/js/widget/widget.v1.js:37
msgctxt "widget"
msgid "Only available with a voucher"
msgstr ""
msgstr "Chỉ áp dụng với phiếu giảm giá"
#: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43
@@ -919,38 +919,38 @@ msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.v1.js:41
msgctxt "widget"
msgid "Not yet available"
msgstr ""
msgstr "Chưa có sẵn"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/js/widget/widget.v1.js:39
msgctxt "widget"
msgid "Not available anymore"
msgstr ""
msgstr "Không có nữa"
#: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/js/widget/widget.v1.js:40
msgctxt "widget"
msgid "Currently not available"
msgstr ""
msgstr "Hiện tại không có sẵn"
#: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/js/widget/widget.v1.js:42
#, javascript-format
msgctxt "widget"
msgid "minimum amount to order: %s"
msgstr ""
msgstr "Số lượng đặt hàng tối thiểu: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/js/widget/widget.v1.js:43
msgctxt "widget"
msgid "Close ticket shop"
msgstr ""
msgstr "Đóng cửa hàng vé"
#: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/js/widget/widget.v1.js:44
msgctxt "widget"
msgid "The ticket shop could not be loaded."
msgstr ""
msgstr "Không thể tải cửa hàng vé."
#: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/js/widget/widget.v1.js:45
@@ -959,24 +959,26 @@ msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop "
"in a new tab to continue."
msgstr ""
"Hiện có rất nhiều người dùng trong cửa hàng vé này. Vui lòng mở cửa hàng ở "
"tab mới để tiếp tục."
#: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/js/widget/widget.v1.js:47
msgctxt "widget"
msgid "Open ticket shop"
msgstr ""
msgstr "Mở cửa hàng vé"
#: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/js/widget/widget.v1.js:48
msgctxt "widget"
msgid "Checkout"
msgstr ""
msgstr "Thanh toán"
#: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/js/widget/widget.v1.js:49
msgctxt "widget"
msgid "The cart could not be created. Please try again later"
msgstr ""
msgstr "Không thể tạo giỏ hàng. Vui lòng thử lại sau"
#: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/js/widget/widget.v1.js:50
@@ -985,12 +987,14 @@ msgid ""
"We could not create your cart, since there are currently too many users in "
"this ticket shop. Please click \"Continue\" to retry in a new tab."
msgstr ""
"Chúng tôi không thể tạo giỏ hàng của bạn do hiện có quá nhiều người dùng "
"trong cửa hàng vé này. Vui lòng nhấn \"Tiếp tục\" để thử lại trong tab mới."
#: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/js/widget/widget.v1.js:52
msgctxt "widget"
msgid "Waiting list"
msgstr ""
msgstr "Danh sách chờ"
#: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/js/widget/widget.v1.js:53
@@ -999,112 +1003,114 @@ msgid ""
"You currently have an active cart for this event. If you select more "
"products, they will be added to your existing cart."
msgstr ""
"Hiện bạn đang có một giỏ hàng còn hiệu lực cho sự kiện này. Nếu bạn chọn "
"thêm sản phẩm, chúng sẽ được thêm vào giỏ hàng hiện tại của bạn."
#: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/js/widget/widget.v1.js:55
msgctxt "widget"
msgid "Resume checkout"
msgstr ""
msgstr "Tiếp tục thanh toán"
#: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/js/widget/widget.v1.js:56
msgctxt "widget"
msgid "Redeem a voucher"
msgstr ""
msgstr "Sử dụng phiếu giảm giá"
#: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/js/widget/widget.v1.js:57
msgctxt "widget"
msgid "Redeem"
msgstr ""
msgstr "Đổi mã"
#: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/js/widget/widget.v1.js:58
msgctxt "widget"
msgid "Voucher code"
msgstr ""
msgstr "Mã giảm giá"
#: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/js/widget/widget.v1.js:59
msgctxt "widget"
msgid "Close"
msgstr ""
msgstr "Đóng"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgctxt "widget"
msgid "Close checkout"
msgstr ""
msgstr "Đóng trang thanh toán"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
msgstr "Bạn không thể hủy thao tác này. Vui lòng chờ quá trình tải hoàn tất."
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
msgctxt "widget"
msgid "Continue"
msgstr ""
msgstr "Tiếp tục"
#: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/js/widget/widget.v1.js:61
msgctxt "widget"
msgid "Show variants"
msgstr ""
msgstr "Hiển thị các biến thể"
#: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/js/widget/widget.v1.js:62
msgctxt "widget"
msgid "Hide variants"
msgstr ""
msgstr "Ẩn các biến thể"
#: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/js/widget/widget.v1.js:63
msgctxt "widget"
msgid "Choose a different event"
msgstr ""
msgstr "Chọn sự kiện khác"
#: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/js/widget/widget.v1.js:64
msgctxt "widget"
msgid "Choose a different date"
msgstr ""
msgstr "Chọn ngày khác"
#: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/js/widget/widget.v1.js:65
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "Quay về"
#: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/js/widget/widget.v1.js:66
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "Tháng sau"
#: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/js/widget/widget.v1.js:67
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "Tháng trước"
#: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/js/widget/widget.v1.js:68
msgctxt "widget"
msgid "Next week"
msgstr ""
msgstr "Tuần sau"
#: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/js/widget/widget.v1.js:69
msgctxt "widget"
msgid "Previous week"
msgstr ""
msgstr "Tuần trước"
#: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/js/widget/widget.v1.js:70
msgctxt "widget"
msgid "Open seat selection"
msgstr ""
msgstr "Mở chọn chỗ ngồi"
#: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/js/widget/widget.v1.js:71
@@ -1114,142 +1120,144 @@ msgid ""
"add yourself to the waiting list. We will then notify if seats are available "
"again."
msgstr ""
"Một số hoặc tất cả các loại vé hiện đã bán hết. Nếu bạn muốn, bạn có thể "
"thêm tên vào danh sách chờ. Chúng tôi sẽ thông báo khi có chỗ ngồi lại."
#: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/js/widget/widget.v1.js:72
msgctxt "widget"
msgid "Load more"
msgstr ""
msgstr "Tải thêm"
#: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/js/widget/widget.v1.js:74
msgid "Mo"
msgstr ""
msgstr "T2"
#: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/js/widget/widget.v1.js:75
msgid "Tu"
msgstr ""
msgstr "T3"
#: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/js/widget/widget.v1.js:76
msgid "We"
msgstr ""
msgstr "T4"
#: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/js/widget/widget.v1.js:77
msgid "Th"
msgstr ""
msgstr "T5"
#: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/js/widget/widget.v1.js:78
msgid "Fr"
msgstr ""
msgstr "T6"
#: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/js/widget/widget.v1.js:79
msgid "Sa"
msgstr ""
msgstr "T7"
#: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/js/widget/widget.v1.js:80
msgid "Su"
msgstr ""
msgstr "CN"
#: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/js/widget/widget.v1.js:81
msgid "Monday"
msgstr ""
msgstr "Thứ Hai"
#: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/js/widget/widget.v1.js:82
msgid "Tuesday"
msgstr ""
msgstr "Thứ Ba"
#: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/js/widget/widget.v1.js:83
msgid "Wednesday"
msgstr ""
msgstr "Thứ Tư"
#: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/js/widget/widget.v1.js:84
msgid "Thursday"
msgstr ""
msgstr "Thứ Năm"
#: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/js/widget/widget.v1.js:85
msgid "Friday"
msgstr ""
msgstr "Thứ Sáu"
#: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/js/widget/widget.v1.js:86
msgid "Saturday"
msgstr ""
msgstr "Thứ Bảy"
#: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/js/widget/widget.v1.js:87
msgid "Sunday"
msgstr ""
msgstr "Chủ Nhật"
#: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/js/widget/widget.v1.js:90
msgid "January"
msgstr ""
msgstr "Tháng 1"
#: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/js/widget/widget.v1.js:91
msgid "February"
msgstr ""
msgstr "Tháng 2"
#: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/js/widget/widget.v1.js:92
msgid "March"
msgstr ""
msgstr "Tháng 3"
#: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/js/widget/widget.v1.js:93
msgid "April"
msgstr ""
msgstr "Tháng 4"
#: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/js/widget/widget.v1.js:94
msgid "May"
msgstr ""
msgstr "Tháng 5"
#: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/js/widget/widget.v1.js:95
msgid "June"
msgstr ""
msgstr "Tháng 6"
#: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/js/widget/widget.v1.js:96
msgid "July"
msgstr ""
msgstr "Tháng 7"
#: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/js/widget/widget.v1.js:97
msgid "August"
msgstr ""
msgstr "Tháng 8"
#: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/js/widget/widget.v1.js:98
msgid "September"
msgstr ""
msgstr "Tháng 9"
#: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/js/widget/widget.v1.js:99
msgid "October"
msgstr ""
msgstr "Tháng 10"
#: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/js/widget/widget.v1.js:100
msgid "November"
msgstr ""
msgstr "Tháng 11"
#: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/js/widget/widget.v1.js:101
msgid "December"
msgstr ""
msgstr "Tháng 12"
#~ msgid ""
#~ "Your color has bad contrast for text on white background, please choose a "

View File

@@ -47,7 +47,8 @@ from django.utils.translation import gettext_lazy as _
from django_scopes import scope, scopes_disabled
from pretix.base.logentrytypes import (
EventLogEntryType, OrderLogEntryType, log_entry_types,
EventLogEntryType, OrderLogEntryType, WaitingListEntryLogEntryType,
log_entry_types,
)
from pretix.base.models import SubEvent
from pretix.base.signals import (
@@ -130,6 +131,11 @@ class SendmailPluginOrderLogEntryType(OrderLogEntryType):
pass
@log_entry_types.new('pretix.plugins.sendmail.waitinglist.email.sent', _('The person on the waiting list received a mass email.'))
class SendmailPluginWaitingListLogEntryType(WaitingListEntryLogEntryType):
pass
@log_entry_types.new('pretix.plugins.sendmail.rule.added', _('An email rule was created'))
@log_entry_types.new('pretix.plugins.sendmail.rule.changed', _('An email rule was updated'))
@log_entry_types.new('pretix.plugins.sendmail.rule.order.email.sent', _('A scheduled email was sent to the order'))

View File

@@ -201,4 +201,5 @@ def send_mails_to_waitinglist(event: Event, user: int, subject: dict, message: d
),
user=user,
attach_cached_files=attachments,
log_entry_type='pretix.plugins.sendmail.waitinglist.email.sent',
)

View File

@@ -55,7 +55,7 @@ class AuthenticationForm(forms.Form):
required_css_class = 'required'
email = forms.EmailField(
label=_("Email"),
widget=forms.EmailInput()
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
)
password = forms.CharField(
label=_("Password"),
@@ -140,6 +140,7 @@ class RegistrationForm(forms.Form):
name_parts = forms.CharField()
email = forms.EmailField(
label=_("Email"),
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
)
error_messages = {
@@ -341,6 +342,7 @@ class ResetPasswordForm(forms.Form):
}
email = forms.EmailField(
label=_('Email'),
widget=forms.EmailInput(attrs={'autocomplete': 'email'}),
)
def __init__(self, request=None, *args, **kwargs):
@@ -388,12 +390,12 @@ class ChangePasswordForm(forms.Form):
)
password_current = forms.CharField(
label=_('Your current password'),
widget=forms.PasswordInput,
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
required=True
)
password = forms.CharField(
label=_('New password'),
widget=forms.PasswordInput,
widget=forms.PasswordInput(attrs={'minlength': '8', 'autocomplete': 'new-password'}),
max_length=4096,
required=True
)
@@ -457,7 +459,7 @@ class ChangeInfoForm(forms.ModelForm):
}
password_current = forms.CharField(
label=_('Your current password'),
widget=forms.PasswordInput,
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
help_text=_('Only required if you change your email address'),
max_length=4096,
required=False
@@ -471,6 +473,8 @@ class ChangeInfoForm(forms.ModelForm):
self.request = request
super().__init__(*args, **kwargs)
self.fields['email'].widget.attrs['autocomplete'] = 'email'
self.fields['name_parts'] = NamePartsFormField(
max_length=255,
required=True,

View File

@@ -57,6 +57,8 @@ class WaitingListForm(forms.ModelForm):
event = self.event
self.fields['email'].widget.attrs['autocomplete'] = 'email'
if event.settings.waiting_list_names_asked:
self.fields['name_parts'] = NamePartsFormField(
max_length=255,

View File

@@ -19,9 +19,9 @@
<div class="panel-body questions-form">
{% if form.position.seat %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Seat" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="5">{% trans "Seat" %}</strong>
</div>
<div class="col-md-9 form-control-text">
{% include "icons/seat.svg" with cls="svg-icon" %}
{{ form.position.seat }}
@@ -30,9 +30,9 @@
{% endif %}
{% if form.position.addons.all %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Selected add-ons" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="5">{% trans "Selected add-ons" %}</strong>
</div>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
{% for a in form.position.addons.all %}
@@ -44,13 +44,13 @@
{% endif %}
{% if form.position.subevent %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Date" context "subevent" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="5">{% trans "Date" context "subevent" %}</strong>
</div>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
<p class="addon-list">
{{ form.position.subevent.name }} &middot; {{ form.position.subevent.get_date_range_display_with_times_as_html }}
</ul>
</p>
</div>
</div>
{% endif %}

View File

@@ -95,9 +95,9 @@
{% endif %}
{% if pos.seat %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Seat" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="4">{% trans "Seat" %}</strong>
</div>
<div class="col-md-9 form-control-text">
{% include "icons/seat.svg" with cls="svg-icon" %}
{{ pos.seat }}
@@ -106,9 +106,9 @@
{% endif %}
{% if pos.addons_without_bundled %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Selected add-ons" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="4">{% trans "Selected add-ons" %}</strong>
</div>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
{% regroup pos.addons_without_bundled by item_and_variation as addons_by_itemvar %}
@@ -121,13 +121,13 @@
{% endif %}
{% if pos.subevent %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Date" context "subevent" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
</div>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
<p class="addon-list">
{{ pos.subevent.name }} &middot; {{ pos.subevent.get_date_range_display_with_times_as_html }}
</ul>
</p>
</div>
</div>
{% endif %}

View File

@@ -96,8 +96,8 @@
{% if not event.settings.show_variations_expanded %}
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{item}}{% endblocktrans %}">
aria-expanded="false" aria-controls="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations"
aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-legend">
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
<span>{% trans "Show variants" %}</span>
</button>
@@ -105,7 +105,7 @@
</div>
<div class="clearfix"></div>
</div>
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations">
{% for var in item.available_variations %}
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row-fluid product-row variation"
{% if not item.free_price %}

View File

@@ -1,4 +1,5 @@
{% load i18n %}
{% load icon %}
{% load eventurl %}
{% load daterange %}
{% load safelink %}
@@ -506,10 +507,23 @@
</p>
<p>
<button class="btn btn-default" type="submit" id="cart-extend-button" aria-describedby="cart-deadline">
<i class="fa fa-refresh" aria-hidden="true"></i> {% trans "Renew reservation" %}
{% icon "refresh" %} {% trans "Renew reservation" %}
</button>
</p>
</form>
<dialog role="alertdialog" id="cart-extend-confirmation-dialog" class="inline-dialog" aria-labelledby="cart-deadline">
<form method="dialog">
<p>
<button class="btn btn-success" autofocus value="OK">
<span role="img" aria-label="{% trans "OK" %}.">
{% icon "check" %}
</span>
{% trans "Reservation renewed" %}
</button>
</p>
</form>
</dialog>
{% else %}
<p class="sr-only" id="cart-description">{% trans "Overview of your ordered products." %}</p>
{% endif %}

View File

@@ -16,13 +16,13 @@
<div class="form-order-change-main">
{% if position.subevent %}
<div class="form-group">
<label class="col-md-3 control-label">
{% trans "Date" context "subevent" %}
</label>
<div class="col-md-3 control-label">
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
</div>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
<p class="addon-list">
{{ position.subevent.name }} &middot; {{ position.subevent.get_date_range_display_with_times_as_html }}
</ul>
</p>
</div>
</div>
{% endif %}

View File

@@ -101,8 +101,8 @@
{% endif %}
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{ item }}{% endblocktrans %}">
aria-expanded="false" aria-controls="{{ form_prefix }}item-{{ item.pk }}-variations"
aria-describedby="{{ form_prefix }}item-{{ item.pk }}-legend">
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
<span>{% trans "Show variants" %}</span>
</button>
@@ -110,7 +110,7 @@
</div>
<div class="clearfix"></div>
</div>
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="{{ form_prefix }}item-{{ item.pk }}-variations">
{% for var in item.available_variations %}
<article aria-labelledby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}"
{% if not item.free_price %}

View File

@@ -15,8 +15,9 @@
<div class="input-group{% if "voucher_invalid" in request.GET %} has-error{% endif %}">
<span class="input-group-addon"><i class="fa fa-ticket fa-fw" aria-hidden="true"></i></span>
<input type="text" class="form-control{% if "voucher_invalid" in request.GET %} has-error{% endif %}" name="voucher" id="voucher"
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
placeholder="{% trans "Voucher code" %}" required="required">
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
autocomplete="off"
placeholder="{% trans "Voucher code" %}" required="required">
</div>
</div>
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />

View File

@@ -34,13 +34,13 @@
{% endblocktrans %}
{% endif %}
</p>
<p class="help-block">
<p class="help-block" id="add-to-list-description">
{% blocktrans trimmed %}
You will <strong>not</strong> receive a confirmation email after you have been added to the waiting list. We will only contact you once a spot opens up.
{% endblocktrans %}
</p>
<p>
<button type="submit" class="btn btn-primary">
<button type="submit" class="btn btn-primary" aria-describedby="add-to-list-description">
{% trans "Add me to the list" %}
</button>
</p>

View File

@@ -48,6 +48,10 @@
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "Renew reservation" %}</button></p>
{% enddialog %}
{% dialog "dialog-cart-extended" "" "" icon="clock-o" alert=true %}
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "OK" %}</button></p>
{% enddialog %}
<dialog id="lightbox-dialog" class="modal-card" role="alertdialog" aria-labelledby="lightbox-label">
<form method="dialog" class="modal-card-inner form-horizontal">
<div class="modal-card-content">

View File

@@ -117,7 +117,7 @@ setup_collapsible_details = function (el) {
el.find("article button[data-toggle=variations]").click(function (e) {
var $button = $(this);
var $details = $button.closest("article");
var $detailsNotSummary = $(".variations", $details);
var $detailsNotSummary = $button.attr("aria-controls") ? $('#' + $button.attr("aria-controls")) : $(".variations", $details);
var isOpen = !$detailsNotSummary.prop("hidden");
if ($detailsNotSummary.is(':animated')) {
e.preventDefault();
@@ -125,7 +125,7 @@ setup_collapsible_details = function (el) {
}
var altLabel = $button.attr("data-label-alt");
$button.attr("data-label-alt", $button.text());
$button.attr("data-label-alt", $button.text().trim());
$button.find("span").text(altLabel);
$button.attr("aria-expanded", !isOpen);

View File

@@ -1,3 +1,10 @@
dialog.inline-dialog {
position: static;
padding: 0;
margin: 0;
border: none;
}
/* Modal dialogs using HTML5 dialog tags for accessibility */
dialog.modal-card {
border: none;
@@ -8,9 +15,6 @@ dialog.modal-card {
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
background: white;
border-radius: $border-radius-large;
opacity: 0;
transition: opacity .5s allow-discrete;
}
.modal-card-inner {
display: flex;
@@ -52,18 +56,8 @@ dialog.modal-card .modal-card-content {
dialog::backdrop {
background-color: rgba(255, 255, 255, .5);
opacity: 0;
transition: opacity .5s allow-discrete;
backdrop-filter: blur(2px);
}
dialog[open], dialog[open]::backdrop {
opacity: 1;
}
@starting-style {
dialog[open], dialog[open]::backdrop {
opacity: 0;
}
}
@media screen and (min-width: $screen-sm-min) {
dialog.modal-card:has(.modal-card-icon) .modal-card-inner {

View File

@@ -7,17 +7,16 @@ $(function () {
$(".chart").css("height", "250px");
var data_type = $("#question_chart").attr("data-type"),
data = JSON.parse($("#question-chart-data").html()),
data = JSON.parse($("#question-chart-data").text() || "[]"),
others_sum = 0,
max_num = 8;
for (var i in data) {
data[i].value = data[i].count;
data[i].label = data[i].answer;
if (data[i].label.length > 20) {
data[i].label = data[i].label.substring(0, 20) + '…';
data = data[0]?.map(function (d) {
return {
'value': d.count,
'label': d.answer.length > 20 ? d.answer.substring(0, 20) + '…' : d.answer,
}
}
}) || [];
if (data_type == 'N') {
// Sort
@@ -36,7 +35,7 @@ $(function () {
// Limit shown options
if (data.length > max_num) {
for (var i = max_num; i < data.length; i++) {
others_sum += data[i].count;
others_sum += data[i].value;
}
data = data.slice(0, max_num);
data.push({'value': others_sum, 'label': gettext('Others')});
@@ -78,7 +77,7 @@ $(function () {
data: data,
resize: true,
xkey: 'label',
ykeys: ['count'],
ykeys: ['value'],
labels: [gettext('Count')]
});
}

View File

@@ -5,7 +5,6 @@ var cart = {
_deadline_call: 0,
_time_offset: 0,
_prev_diff_minutes: 0,
_renewed_message: "",
_get_now: function () {
return moment().add(cart._time_offset, 'ms');
@@ -59,7 +58,6 @@ var cart = {
$("#cart-deadline").text(gettext("Your cart is about to expire."))
} else {
$("#cart-deadline").text(
cart._renewed_message + " " +
ngettext(
"The items in your cart are reserved for you for one minute.",
"The items in your cart are reserved for you for {num} minutes.",
@@ -74,7 +72,6 @@ var cart = {
pad(diff_minutes.toString(), 2) + ':' + pad(diff_seconds.toString(), 2)
);
cart._renewed_message = "";
cart._deadline_timeout = window.setTimeout(cart.draw_deadline, 500);
}
var already_expired = diff_total_seconds <= 0;
@@ -112,7 +109,6 @@ var cart = {
}
cart._deadline_timeout = null;
cart._max_extend = moment(max_extend);
cart._renewed_message = renewed_message || "";
cart.draw_deadline();
}
};
@@ -122,22 +118,41 @@ $(function () {
if ($("#cart-deadline").length) {
cart.init();
$("#cart-extend-confirmation-button").hide().on("blur", function() {
$(this).hide();
});
}
$("#cart-extend-form").on("pretix:async-task-success", function(e, data) {
if (data.success) {
cart.set_deadline(data.expiry, data.max_expiry_extend, data.message);
var cart_panel_heading = $(this).closest(".panel").find(".panel-heading").get(0);
if (cart_panel_heading) {
cart_panel_heading.focus();
}
cart.set_deadline(data.expiry, data.max_expiry_extend);
} else {
alert(data.message);
}
});
// renew-button in cart-panel is clicked, show inline dialog
$("#cart-extend-button").on("click", function() {
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
if (data.success) {
document.getElementById("cart-extend-confirmation-dialog").show();
}
});
});
$("#cart-extend-confirmation-dialog").on("keydown", function (e) {
if(e.key === "Escape") {
this.close();
}
});
// renew-button in modal dialog is clicked, show modal dialog
$("#dialog-cart-extend form").submit(function() {
$("#cart-extend-form").submit();
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
if (data.success) {
$("#dialog-cart-extended-title").text(data.message);
$("#dialog-cart-extended-description").text($("#cart-deadline").text());
document.getElementById("dialog-cart-extended").showModal();
}
}).submit();
});
$(".toggle-container").each(function() {

View File

@@ -7,4 +7,12 @@ var inIframe = function () {
};
if (inIframe()) {
document.documentElement.classList.add('in-iframe');
try {
window.parent.postMessage({
type: "pretix:widget:title",
title: document.title,
}, "*");
} catch (e) {
console.error("Could not post message to parent.", e);
}
}

View File

@@ -252,7 +252,7 @@ Vue.component('availbox', {
variation: Object
},
mounted: function() {
if (this.$root.itemnum === 1 && !this.$root.has_seating_plan ? 1 : 0) {
if (this.$root.itemnum === 1 && (!this.$root.categories[0].items[0].has_variations || this.$root.categories[0].items[0].variations.length < 2) && !this.$root.has_seating_plan ? 1 : 0) {
this.$refs.quantity.value = 1;
if (this.order_max === 1) {
this.$refs.quantity.checked = true;
@@ -823,7 +823,7 @@ var shared_loading_fragment = (
);
var shared_iframe_fragment = (
'<dialog :class="frameClasses" role="alertdialog" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
'<dialog :class="frameClasses" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
+ '<div class="pretix-widget-frame-loading" v-show="$root.frame_loading">'
+ '<svg width="256" height="256" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path class="pretix-widget-primary-color" d="M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"/></svg>'
+ '<p :class="cancelBlockedClasses"><strong>'+strings.cancel_blocked+'</strong></p>'
@@ -903,6 +903,14 @@ Vue.component('pretix-overlay', {
}
}
},
'$root.frame_shown': function (newValue) {
if (newValue) {
var btn = this.$el?.querySelector('.pretix-widget-frame-close button');
this.$nextTick(function() {
btn.focus();
});
}
},
},
computed: {
frameClasses: function () {
@@ -931,7 +939,18 @@ Vue.component('pretix-overlay', {
}
},
},
mounted () {
window.addEventListener('message', this.onMessage, false);
},
unmounted () {
window.removeEventListener('message', this.onMessage, false);
},
methods: {
onMessage: function(e) {
if (e.data.type && e.data.type == "pretix:widget:title") {
this.$el.querySelector("iframe").title = e.data.title;
}
},
lightboxClose: function () {
this.$root.lightbox = null;
},
@@ -1563,14 +1582,14 @@ Vue.component('pretix-widget-event-calendar', {
+ '<a class="pretix-widget-event-calendar-previous-month" href="#" @click.prevent.stop="prevmonth">&laquo; '
+ strings['previous_month']
+ '</a> '
+ '<strong>{{ monthname }}</strong> '
+ '<strong :id="aria_labelledby">{{ monthname }}</strong> '
+ '<a class="pretix-widget-event-calendar-next-month" href="#" @click.prevent.stop="nextmonth">'
+ strings['next_month']
+ ' &raquo;</a>'
+ '</div>'
// Calendar
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-label="monthname">'
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-labelledby="aria_labelledby">'
+ '<thead>'
+ '<tr>'
+ '<th aria-label="' + strings['days']['MONDAY'] + '">' + strings['days']['MO'] + '</th>'
@@ -1597,6 +1616,9 @@ Vue.component('pretix-widget-event-calendar', {
id: function () {
return this.$root.html_id + "-event-calendar-table";
},
aria_labelledby: function () {
return this.$root.html_id + "-event-calendar-table-label";
},
},
methods: {
back_to_list: function () {
@@ -2182,11 +2204,22 @@ var create_overlay = function (app) {
// show loading spinner only when previously no frame_src was set
if (newValue && !oldValue) {
this.frame_loading = true;
this.$el?.querySelector('dialog.pretix-widget-frame-holder').showModal();
}
// to close and unload the iframe, frame_src can be empty -> make it valid HTML with about:blank
this.$el.querySelector("iframe").src = newValue || "about:blank";
},
frame_loading: function (newValue) {
var dialog = this.$el?.querySelector('dialog.pretix-widget-frame-holder');
if (newValue) {
if (!dialog.open) {
dialog.showModal();
}
} else {
if (!this.frame_src && dialog.open) {// finished loading, but no iframe to display => close
dialog.close();
}
}
},
}
});
app.$root.overlay = framechild;

View File

@@ -113,7 +113,7 @@
line-height: normal;
border: 1px solid $input-border;
border-radius: $input-border-radius;
height: $input-height-base;
min-height: $input-height-base;
padding: $padding-base-vertical $padding-base-horizontal;
color: $input-color;
background-color: $input-bg;

View File

@@ -1901,10 +1901,11 @@ TEST_QUOTA_RES = {
@pytest.mark.django_db
def test_quota_list(token_client, organizer, event, quota, item, subevent):
def test_quota_list(token_client, organizer, event, quota, item, item3, subevent):
quota.items.add(item3)
res = dict(TEST_QUOTA_RES)
res["id"] = quota.pk
res["items"] = [item.pk]
res["items"] = [item.pk, item3.pk]
resp = token_client.get('/api/v1/organizers/{}/events/{}/quotas/'.format(organizer.slug, event.slug))
assert resp.status_code == 200
@@ -1922,6 +1923,13 @@ def test_quota_list(token_client, organizer, event, quota, item, subevent):
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/quotas/?items__in={},{},0'.format(organizer.slug, event.slug, item.pk, item3.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/quotas/?items__in=0'.format(organizer.slug, event.slug))
assert [] == resp.data['results']
@pytest.mark.django_db
def test_quota_detail(token_client, organizer, event, quota, item):

View File

@@ -961,6 +961,42 @@ def test_order_create_fee_as_percentage(token_client, organizer, event, item, qu
assert o.total == Decimal('25.30')
@pytest.mark.django_db
def test_order_create_fee_as_percentage_with_zero(token_client, organizer, event, item, quota, question):
with scopes_disabled():
voucher = event.vouchers.create(price_mode="set", value=Decimal("0.00"))
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
res['fees'][0]['_treat_value_as_percentage'] = True
res['fees'][0]['_split_taxes_like_products'] = True
res['fees'][0]['value'] = '10.00'
res['positions'][0]['item'] = item.pk
res['positions'][0]['answers'][0]['question'] = question.pk
res['positions'][0]['voucher'] = voucher.code
del res['positions'][0]['price']
res['simulate'] = True
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 201
assert resp.data["total"] == "0.00"
res['simulate'] = False
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 201
with scopes_disabled():
o = Order.objects.get(code=resp.data['code'])
fee = o.fees.first()
assert fee.value == Decimal('0.00')
assert o.total == Decimal('0.00')
@pytest.mark.django_db
def test_order_create_fee_with_auto_tax(token_client, organizer, event, item, quota, question, taxrule):
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)

View File

@@ -225,8 +225,11 @@ def test_full_clone_cross_organizer_differences():
organizer2 = Organizer.objects.create(name='Dummy2', slug='dummy2')
membership_type = organizer.membership_types.create(name="Membership")
plan = SeatingPlan.objects.create(name="Plan", organizer=organizer, layout="{}")
sc = organizer.sales_channels.get(identifier="web")
sc2 = organizer2.sales_channels.get(identifier="web")
sc1_a = organizer.sales_channels.get(identifier="web")
sc1_b = organizer.sales_channels.create(identifier="b")
sc1_c = organizer.sales_channels.create(identifier="c")
sc2_a = organizer2.sales_channels.get(identifier="web")
sc2_c = organizer2.sales_channels.create(identifier="c")
event = Event.objects.create(
organizer=organizer, name='Dummy', slug='dummy',
@@ -237,15 +240,20 @@ def test_full_clone_cross_organizer_differences():
seating_plan=plan,
all_sales_channels=False,
)
event.limit_sales_channels.add(sc)
event.limit_sales_channels.add(sc1_a)
event.limit_sales_channels.add(sc1_b)
event.limit_sales_channels.add(sc1_c)
item1 = event.items.create(name="Ticket", default_price=23,
grant_membership_type=membership_type,
all_sales_channels=False)
item1.limit_sales_channels.add(sc)
item1.limit_sales_channels.add(sc1_a)
item2 = event.items.create(name="T-shirt", default_price=15)
item2.require_membership_types.add(membership_type)
event.settings.payment_giftcard__enabled = True
event.settings.payment_giftcard__restrict_to_sales_channels = ['web', 'b', 'c']
copied_event = Event.objects.create(
organizer=organizer2, name='Dummy2', slug='dummy2',
date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc),
@@ -257,11 +265,14 @@ def test_full_clone_cross_organizer_differences():
assert organizer2.seating_plans.count() == 1
assert organizer2.seating_plans.get().layout == plan.layout
assert copied_event.seating_plan.organizer == organizer2
assert copied_event.limit_sales_channels.get() == sc2
assert set(copied_event.limit_sales_channels.all()) == {sc2_a, sc2_c}
assert event.seating_plan.organizer == organizer
copied_item1 = copied_event.items.get(name=item1.name)
copied_item2 = copied_event.items.get(name=item2.name)
assert copied_item1.grant_membership_type is None
assert copied_item2.require_membership_types.count() == 0
assert copied_item1.limit_sales_channels.get() == sc2
assert copied_item1.limit_sales_channels.get() == sc2_a
assert event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'b', 'c']
assert copied_event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'c']